In [30]:
# Some math utility functions
from math import sqrt
'''
Simple primality test
'''
def is_prime(n):
if n == 2:
return True
if n % 2 == 0 or n <= 1:
return False
sqr = int(sqrt(n)) + 1
for divisor in range(3, sqr, 2):
if n % divisor == 0:
return False
return True
from math import gcd as bltin_gcd
'''
Check if two numbers are coprime
'''
def coprime2(a, b):
return bltin_gcd(a, b) == 1
'''
Check if number is of the form p^k, and return k
TODO: p must be prime !
'''
def is_multiple_of_k(number):
# copy value ?
if sqrt(number) == int(sqrt(number)):
return int(sqrt(number))
# if number != p^2 -> p^n, n > 2, while p^n > 1.0 ?
power = 3
last_good = -1
while number:
root = number ** 1/power
# print('root: ', root)
# print('power: ', power)
if root == int(root):
last_good = int(root)
elif root <= 1.1:
if last_good != -1:
return last_good
return -1
power += 1
# alternative, for every number < sqrt(number), check if number % integer == int(...)
print(is_multiple_of_k(4))
print(is_multiple_of_k(100))
print(is_multiple_of_k(101))
print(is_multiple_of_k(32))
# recommended: do prime factorization of a number (rule 3), and after that use rule 4
In [31]:
'''
Euler's totient calculator
- costly
'''
def calculate_euler_totient(p):
if p == 1:
return 1
elif is_prime(p):
return p-1
#elif
#coprime2(a, b):
# elif is_multiple_of_k(p) != -1:
# return p - p^e-1
print('\nEuler\'s totient function')
print(' \u03D5(%s) = %s ' % ( 1, str(calculate_euler_totient(1)) ))
print(' \u03D5(%s) = %s ' % ( 3, str(calculate_euler_totient(3)) ))
In [ ]: