在给定的限制中打印Carmichael数字

问题描述 投票:0回答:1

我正在尝试列出所有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
python number-theory
1个回答
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测试,但是您知道了。

© www.soinside.com 2019 - 2024. All rights reserved.