【问题标题】:Printing Carmichael numbers in a given limit在给定的限制内打印卡迈克尔数
【发布时间】:2019-11-19 22:49:13
【问题描述】:

我正在尝试列出所有小于 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

【问题讨论】:

  • 它为我打印了很多数字(实际上有点太多,包括非卡迈克尔数字)。您希望看到什么?
  • 为我调用 print_carmichael(1000) 会导致达到最大递归深度。
  • 是的,这就是问题所在。我只想输出 carmichael 数字。

标签: python number-theory


【解决方案1】:

我看到的主要问题是您没有像Wolfram MathWorld 那样过滤掉素数:

卡迈克尔数是奇合数

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
% 

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

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

【讨论】:

    猜你喜欢
    • 2020-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-16
    • 2021-09-23
    相关资源
    最近更新 更多