import numpy as np

# Simple motivation:
# take two positive integers  a and b
# calculate
#          result = 1 + a*b
# Can result become 0?

# In numpy calculate  [1, 1] + [65535, 65537] * 65537, 65535]
# which is equal to   [ 1 + 65535*65537, 1 + 65537*65535 ]
strange1 = np.array( [65535, 65537] )
strange2 = np.array( [65537, 65535] )
intOnes = np.array( [1, 1] )
result = intOnes + strange1 * strange2
print( strange1 )
print( strange2 )
print( result )

# Thus, we get invalid values without any warning.

s = input()

# ----------------------------------------------------------
# Sometimes, a warning may appear:

print( strange1[0] )
print( strange1[1] )
print( 1 + strange1[0]*strange1[1] )

s = input()

# ===== Conclusion: Be careful when manipulating "big" integers.
# ===== Plain Python is OK, other tools or languages not necessarily so.

# ----------------------------------------------------------
# get acquainted with integer limits
print( "integer limits of particular integer types" )

print( np.iinfo(np.int8) )
print( np.iinfo(np.int16) )
print( np.iinfo(np.int32) )
print( np.iinfo(np.int64) )

print( np.iinfo(np.uint8) )
print( np.iinfo(np.uint16) )
print( np.iinfo(np.uint32) )
print( np.iinfo(np.uint64) )

print()


s = input()

# ----------------------------------------------------------
# Some additional get acquainted with integer limits

arr = np.arange( 120,130 )
print( arr, arr.dtype )

arr = np.arange( 120,130, dtype = np.int8 )
print( arr, arr.dtype )

arr = np.arange( 250, 260, dtype = np.uint8 )
print( arr, arr.dtype )

print()

arr = np.arange( 10, 20 )
for k in range( 6 ):
    print( arr )
    print() 
    arr = arr*arr







