Python素性检查28430288029929701389

时间:2016-12-29 20:54:44

标签: python algorithm

我已经看过许多Python算法来检查素数,但我发现在查看特定数字时它们都会失败:28430288029929701389

我使用过这个算法: What is the best algorithm for checking if a number is prime?

from __future__ import print_function
import sys
from sys import argv

def is_prime(n):
    if n == 2:
        return True
    if n == 3:
        return True
    if n % 2 == 0:
        return False
    if n % 3 == 0:
        return False

    i = 5
    w = 2

    while i * i <= n:
        if n % i == 0:
            return False

        i += w
        w = 6 - w

    return True

number_to_check = int(argv[1])

if is_prime(number_to_check):
    print("%d is prime" % number_to_check)
else:
    print("%d is not prime" % number_to_check)

和这些算法: https://coderwall.com/p/utwriw/prime-numbers-with-python#comment_28424

当检查这个特定数字的素数时,它们都会进入无限循环。我可以检查更大的数字,结果立即回来。有人知道这是否是Python的问题?

2 个答案:

答案 0 :(得分:6)

可能是因为这个数字 是素数?验证需要sqrt次,并且

In [10]: math.sqrt(28430288029929701389)
Out[10]: 5332006004.303606

Python不是一种非常快速的语言;循环5332006004次可以花费时间。

你正在尝试的大得多的数字可以是复合的,因此可以快速找到一个因素。

我推荐像Miller-Rabin这样的概率素数测试算法或其“真实”素数测试的变体。这些算法速度非常快,多次运行可以使误差概率低于宇宙射线事件。

答案 1 :(得分:2)

鉴于version: "2" services: web: build: ./web ports: - "80:80" volumes: - ~/Sites/symfony.local/:/var/www/symfony.local/public_html/ depends_on: - db - mongo mongo: image: mongo:latest mysql: image: mysql:latest ports: - "3306:3306" environment: MYSQL_ROOT_PASSWORD: password 导入,我猜你是否正在使用Python 2.something?

如果是这样,你有没有看过primefac模块? (它似乎不适用于Python 3)

__future__

根据Eli Bendersky的回应,这似乎是最重要的。此外,import primefac biggie = 28430288029929701389 print(list(primefac.primefac(biggie))) # [28430288029929701389L] primefac.isprime(biggie) # True 几乎会在我运行时立即返回您特定号码的结果。