所以我有一个公式可以比一遍又一遍地乘以每对素数更快地解决半素数!因此,不必使用长猜和检查(如下所示),而是使用基本分割。
semi prime = 15 ... 2 * 3, 2 * 5, 2 * 7, 3 * 5 ... primes 3 and 5
这是我的方式
semi prime = 15 ... 2 / 15, 3 / 15 ... primes ... primes 3 and 5
它不会在这里改变很多长度,但它会在更大的半素数中改变。但现在我想知道是否有一个python程序可以为我做这个?到目前为止,我不能做一个,但我正在努力。
答案 0 :(得分:2)
你想要的是对数字进行分解,这里是一个如何
的例子def prime_generator(n):
"""produce all the prime numbers less or equal to n"""
#put here the code for this
def prime_factorization(n):
"""return a list of with the all prime factors of n including their multiplicity"""
result=[]
for p in prime_generator(n):
while n%p==0: #while p divide n...
result.append(p)
n = n//p
if n<=1:
break
return result
def is_semi_prime(n):
factors = prime_factorization(n)
if len(factors) == 2:
print n, "is a semi prime with those prime factors:", factors
else:
print n, "is not a semi-prime"
is_semi_prime( input("enter a number: ") )
这里有趣的部分是prime_generator
,它可以像使用is_prime
函数(例如filter(is_prime,xrange(2,n+1))
)过滤数字一样简单,或者更像{{3}更专业的内容}}
修改
以上使用一般方法解决问题可以通过专门的检查进一步改进,因为半素数只有两个因素,然后我们只需要找到第一个,从数字中删除它,如果剩下的是我们找到了它。为此,我们需要一个素数检查函数和素数生成器def is_prime(n):
#put here the code for this
def prime_generator(n):
#put here the code for this
def is_semi_prime(n):
p1,p2 = 0,0
for p1 in prime_generator(n):
if n%p1==0:
p2 = n//p1
break
if is_prime(p2):
print n, "is a semi prime with those prime factors:", p1, p2
else:
print n, "is not a semi-prime"
is_semi_prime( input("enter a number: ") )
我认为这是您尝试解释的算法,因为您可以看到不需要仅搜索第一个(p2
)的第二个素数(p1
)而另一个将如果它存在,它会自然出现。
我将这两项功能留作练习。
对于is_prime
,您可以像在答案中那样使用简单的试验部门,顺便说一下,无法识别2作为素数,或者像Sieve of Eratostenes更强大的test (Miller-Rabin test)(您可以在Deterministic variants)或http://rosettacode.org中找到工作版本。
对于你可以使用的prime_generator
,正如我在Eratostenes的Sieve之前提到的,或者使用无限素数发生器。例如,您可以找到以下问题:Baillie-PSW test和Sieve of eratosthenes finding primes python。后者是我最喜欢的
答案 1 :(得分:1)
从来没有想过,我把它弄清楚了。
import math
running = True
prime_1 = 0
prime_2 = 0
semi_prime = 0
n = 0
semi_prime = input('Enter Semi-Prime: ')
while running:
if prime_1 * prime_2 == semi_prime:
print('your 2 primes are')
print([prime_1])
print([prime_2])
running = False
else:
n += 1
def is_prime(number):
if number < 2:
return False
if number % 2 == 0:
return False
else:
for i in range(3, number):
if not number % i:
return False
return True
#This array stores all the prime numbers found till n
primes = []
for i in range(100000):
if is_prime(i):
primes.append(i)
if len(primes) == n:
break
print("next prime is " + str(primes[n-1]))
prime_1 = primes[n-1]
prime_2 = semi_prime / primes[n-1]