为了测试一个数字是否为素数,为什么我们必须测试它是否只能被该数字的平方根整除?
这是我能提出的最佳算法.
def get_primes(n):
numbers = set(range(n, 1, -1))
primes = []
while numbers:
p = numbers.pop()
primes.append(p)
numbers.difference_update(set(range(p*2, n+1, p)))
return primes
>>> timeit.Timer(stmt='get_primes.get_primes(1000000)', setup='import get_primes').timeit(1)
1.1499958793645562
Run Code Online (Sandbox Code Playgroud)
可以做得更快吗?
此代码有一个缺陷:由于numbers是无序集,因此无法保证numbers.pop()从集中删除最小数字.然而,它对某些输入数字起作用(至少对我而言):
>>> sum(get_primes(2000000))
142913828922L
#That's the correct sum of all numbers below 2 million
>>> 529 in get_primes(1000)
False
>>> 529 in get_primes(530)
True
Run Code Online (Sandbox Code Playgroud) 我写了下面的代码,应该检查输入的数字是否是素数,但是有一个问题我无法通过:
def main():
n = input("Please enter a number:")
is_prime(n)
def is_prime(a):
x = True
for i in (2, a):
while x:
if a%i == 0:
x = False
else:
x = True
if x:
print "prime"
else:
print "not prime"
main()
Run Code Online (Sandbox Code Playgroud)
如果输入的数字不是素数,则显示"非素数",因为它应该是,但如果数字是素数,则它不显示任何内容.你能帮帮我吗?
两部分问题......
1)试图确定600851475143的最大素数因子,发现这个程序似乎在线工作,问题是我很难弄清楚它是如何工作的(我理解程序正在做什么的基础)...另外,如果您能够了解一些您可能知道找到素数的方法(可能没有测试每个数字)以及您的方法是如何工作的.
我在网上找到的主要因素代码
n = 600851475143
i = 2
while i * i < n:
while n % i == 0:
n = n / i
i = i + 1
print (n)
#takes about ~0.01secs
Run Code Online (Sandbox Code Playgroud)
2)为什么代码比这段代码快得多(代码只是测试速度而没有其他真正的用途)
i = 1
while i < 100:
i += 1
#takes about ~3secs
Run Code Online (Sandbox Code Playgroud) 所以我能够通过互联网的一些帮助来解决这个问题,这就是我得到的:
def isPrime(n):
for i in range(2,int(n**0.5)+1):
if n%i==0:
return False
return True
Run Code Online (Sandbox Code Playgroud)
但我的问题是如何做到这一点,但为什么.我知道1不被认为是"素数",即使它是,并且我理解如果它在范围内除以ANYTHING则自动为素数,因此返回False语句.但我的问题是"n"在这里的平方是什么角色?非常感谢您的关注
Ps我非常缺乏经验,一个月前刚刚开始编程:S
我一直试图编写一个程序,它将采用一个输入的数字,并检查它是否是素数.到目前为止,我所做的代码完全可以正常工作,如果这个数字实际上是素数.如果数字不是素数,那就很奇怪了.我想知道是否有人能告诉我代码的问题.
a=2
num=13
while num > a :
if num%a==0 & a!=num:
print('not prime')
a=a+1
else:
print('prime')
a=(num)+1
Run Code Online (Sandbox Code Playgroud)
当24被输入时给出的结果是:不是素数不是素数而不是素数
我如何修复每个偶数的每个奇数而不是素数的报告素数的错误
对于库,我需要将第一个素数存储到极限L.此集合必须具有O(1)查找时间(以检查数字是否为素数)并且必须很容易,给定数字,找到下一个素数(假设它小于L).
鉴于L是固定的,生成清单的Eratostene筛子很好.现在,我使用一个打包的布尔数组来存储列表,该列表仅包含3到L(含)之间的奇数的条目.这需要(L-2)/ 2位内存.我希望能够在不使用更多内存的情况下静态增加L.
是否存在使用具有相似属性的较少内存的数据结构?或者至少具有恒定的查找时间?(然后可以枚举奇数,直到我们得到一个素数)
(我在其中编写的语言是因子,但这个问题在内置或易于编程的打包位数组的任何语言中都是相同的)
我正在尝试完成代码检查挑战,要求您检查数字是否为素数.无论出于何种原因,我的解决方案似乎不适用于奇素数的平方(例如9返回true而不是false).
function isPrime(num) {
if (num === 2) {
return true;
}
else if(num > 1){
for (var i = 2; i < num; i++) {
if (num % i !== 0 ) {
return true;
}
else if (num === i * i) {
return false
}
else {
return false;
}
}
}
else {
return false;
}
}
console.log(isPrime(121));
Run Code Online (Sandbox Code Playgroud)
Ps我包括第二个else/if语句,因为我试图解决问题.
我正在尝试在Python中进行简单的素性测试.
根据维基百科,素数测试如下:
给定输入数n,检查从2到n-1的任何整数m是否除以n.如果n可以被任何m整除,则n是复合的,否则它是素数.
我开始排除偶数 - 除了2 - 作为素数的候选人
def prime_candidates(x):
odd = range(1, x, 2)
odd.insert(0, 2)
odd.remove(1)
return odd
Run Code Online (Sandbox Code Playgroud)
然后根据上面的规则编写一个函数来检查质数.
def isprime(x):
for i in range(2, x-1):
if x % i == 0:
return False
else:
return True
Run Code Online (Sandbox Code Playgroud)
这是主要功能,它迭代8000个主要候选人的列表并测试他们的素数
def main():
end = 8000
candidates = prime_candidates(end)
for i in candidates:
if isprime(i) and i < end:
print 'prime found ' + str(i)
Run Code Online (Sandbox Code Playgroud)
问题是isprime函数为非素数的数字返回True.
我已经开始学习使用Java编写代码并决定使用Project Euler站点给我一些小任务来尝试完成我学习的每一段新编码.所以我遇到了问题3:
13195的主要因素是5,7,13和29. 600851475143中最大的素数是多少?
我考虑了这个问题并研究了很多关于素数的不同理论以及如何通过各种不同的计算找到它们(以Eratosthenes的筛子为例)我想出的解决方案是测试2 - > n中的数字并查看是否它们是素数,如果它们是那么我将Tn变量(在这种情况下为600851475143)除以新发现的素数并查看它是否是一个因子.如果是,我会将它分配给变量Hp(最高素数),在程序结束时我会将Hp输出到控制台给出我的结果.
这是我的代码:
public class Largest_Prime_Factor_NEW_SOLUTION {
static long Tn = 600851475143L;
static long Hp = 0;
static boolean isPrime = false;
public static void main(String[] args) {
for (long i=2; i<Tn; i++) {
System.out.println("TESTING NUMBER " + i);
for (long k=2; k < i; k++) {
if (i % k == 0) {
System.out.println(i + " IS NOT A PRIME");
break;
} else if (k + 1 == i) …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个程序,告诉您数字是否为素数.这里是.正如您在运行该chkPrime函数时所看到的,一切都返回true.我为我的生活无法弄明白.有任何想法吗?
total=0
#Check if number is whole
def chkWhole(x):
if(x%1 == 0):
return True
else:
return False
#Check to see if the number divides evenly with all primes
def chkModtwo(n):
a=n%2
if chkWhole(a)==True:
return True
else:
return False
def chkModthree(n):
a=n%3
if chkWhole(a)==True:
return True
else:
return False
def chkModfive(n):
a=n%5
if chkWhole(a)==True:
return True
else:
return False
def chkModseven(n):
a=n%7
if chkWhole(a)==True:
return True
else:
return False
#Check if the number is a prime using other two …Run Code Online (Sandbox Code Playgroud) 我有一个数字列表,[7, 9, 11, 13, 15, 20, 23]我需要根据给定列表创建一个素数列表。
我已经写了下面的代码,但这个结果9与15首相了。我没有得到我在这里想念的东西。
a = [7, 9, 11, 13, 15, 20, 23]
x = []
for i in range (0, len(a)):
num = a[i]
for m in range (2,num):
if (num % m)==0:
break
else:
print('This is prime', num)
x.insert(i, num)
break
Run Code Online (Sandbox Code Playgroud)
我期望输出列表x为[7, 11, 13, 23]。
我已经看过很多检查primality的Python算法,但我发现在查看特定数字时它们都会失败:28430288029929701389
我使用过这个算法: 检查数字是否为素数的最佳算法是什么?
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 …Run Code Online (Sandbox Code Playgroud) primes ×11
python ×9
algorithm ×3
math ×3
function ×1
java ×1
javascript ×1
optimization ×1
python-3.x ×1