在给定limi中打印Carmichael数

2024-09-22 16:42:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图列出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

Tags: 函数inforreturnifisdefrange
1条回答
网友
1楼 · 发布于 2024-09-22 16:42:36

我看到的主要问题是,您没有像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

相关问题 更多 >