我正在尝试列出所有10000以下的Carmichael数字,但是,我认为print_carmichael
函数存在问题。由于某些原因,当n
为true时,它不会打印所有的is_carmichael
值。
def is_carmichael(n):
b = 2
while b<n:
if (gcd(b, n) == 1):
if (pow(b, n - 1, n) != 1):
return 0
b = b + 1
return 1
def print_carmichael(max):
for n in range(2, max):
if is_carmichael(n):
print(n)
return 0
我看到的主要问题是,您没有像Wolfram MathWorld所述过滤掉质数:
Carmichael数是一个奇数复合数
from math import gcd
def is_prime(number):
if number <= 2:
return number == 2
if number % 2 == 0:
return False
for divisor in range(3, int(number ** 0.5) + 1, 2):
if number % divisor == 0:
return False
return True
def is_carmichael(n):
# a Carmichael number is an odd composite number
if n <= 2 or n % 2 == 0 or is_prime(n):
return False
for a in range(2, n):
if gcd(a, n) == 1:
if pow(a, n - 1, n) != 1:
return False
a += 1
return True
def print_carmichael(maximum):
for number in range(maximum):
if is_carmichael(number):
print(number)
print_carmichael(100_000)
输出
% python3 test.py
561
1105
1729
2465
2821
6601
8911
10585
15841
29341
41041
46657
52633
62745
63973
75361
%
也许有一种更有效的方法来进行composite测试,但是您知道了。