Я создаю все необходимые функции для алгоритма RSA. К сожалению, я не могу сделать правильную функцию Кармайкла.
Это функции, которые я написал:
def gcd(a, b): # Greatest Common Divisor Generator (Euclidean Algorithm)
while b != 0: # While remainder exists
t = b # Initially r[k-1]
b = a % t # Initially r[k] = r[k-2] mod r[k-1] (where r[k-2] is a)
a = t # Predecessor of remainder (b)
return a
def phi(n): # Leonard Euler's Totient Function
y = 0
for k in range(1, n + 1): # Phi(+n) is the number of integers k in the range (1 <= k >= n)...
if gcd(n, k) == 1: # for which gcd(n, k) = 1
y += 1
return y
def carmichael(n): # Robert Daniel Carmichael's Function
y = (phi(n) * 1/2) if (n > 4 and ((n & (n - 1)) == 0)) else phi(n) # phi(n) * 1/2 if 2^x = n, else phi(n) * 1
return y
Я использую функцию totient для генерации чисел. Насколько мне известно, существует простое правило: если число является степенью двойки и больше 4, количество его простых чисел должно быть уменьшено вдвое, иначе оно равно фи (n).
Приведенное выше правило отлично работает в моем коде. Например, если входное значение равно 8, это результаты:
phi(8) = 4
carmichael(8) = 2
Но проблема в том, что функция Кармайкла по какой-то причине также делит пополам другие числа, например, если вход равен 12, вот что возвращают мои функции:
phi(12) = 4
carmichael(12) = 4
Но вот как это должно выглядеть:
phi(12) = 4
carmichael(12) = 2
Почему это происходит? Возможно, к непростым нечетным числам следует относиться по-другому? Есть ли что-то, что мне нужно добавить к моей функции?
Благодарю вас!
n (1-1/p1)(1-1/p2)...(1-1/pm)
- person Mr. T   schedule 12.12.2017