我正在为 RSA 算法创建所有必要的函数。不幸的是,我似乎无法做出正确的 Carmichael 功能。
这些是我编写的函数:
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 函数进行数字生成。据我所知,有一个简单的规则,如果数字是 2 的幂并且大于 4,则其质数的数量应减半,否则等于 phi(n)。
上面的规则在我的代码中完美运行,例如,如果输入值为 8,则结果如下:
phi(8) = 4
carmichael(8) = 2
但问题是,Carmichael 函数也出于某种原因将其他数字减半,例如,如果输入是 12,这就是我的函数返回的内容:
phi(12) = 4
carmichael(12) = 4
但它应该是这样的:
phi(12) = 4
carmichael(12) = 2
为什么会这样?也许非质数奇数应该被区别对待?有什么我需要添加到我的函数中的吗?
谢谢!