在给定的限制内打印 Carmichael 数

Printing Carmichael numbers in a given limit

我试图列出 10000 以下的所有 Carmichael 数字,但是,我认为 print_carmichael 函数有问题。出于某种原因,当 is_carmichael 为真时,它不会打印所有 n 值。

  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 那样过滤掉质数:

A Carmichael number is an odd composite number

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(3, n, 2):
        if gcd(a, n) == 1:
            if pow(a, n - 1, n) != 1:
                return False

    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
% 

可能有一种更有效的方法来执行 复合 测试,但你明白了。我们可以 简化 这段代码,以 速度 为代价,通过使用 is_charmichael() 本身的逻辑来过滤掉素数并抛出我们的显式 is_prime() 函数:

def is_carmichael(n):

    # a Carmichael number is an odd number
    if n <= 2 or n % 2 == 0:
        return False

    may_be_prime = True

    for a in range(3, n, 2):
        if gcd(a, n) == 1:
            if pow(a, n - 1, n) != 1:
                return False
        else:
            may_be_prime = False

    return not may_be_prime