我已经看过许多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的问题?
答案 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
几乎会在我运行时立即返回您特定号码的结果。