1

私の以下の方法は、スーパークーパーとスーパークーパーです。最適化に関する提案に関するヒント。私は2つの異なる素数のセミプライムについて知っていますが、その数はセミプライムの半分以下です。しかし、素数のリストを大量に効率的にチェックする方法についてはわかりません。 nが13桁の場合は、鉱山が崩壊すると大きくなります。セミプライムファクタリングアルゴリズムを最適化

import math 
def eratosthenes(n): 
    multiples = set() 
    primes = set() 
    for i in range(2, n+1): 
     if i not in multiples: 
      if i <= math.ceil(math.sqrt(n)+10): 
       primes.add(i) 
        for j in range(i*i, n+1, i): 
         multiples.add(j) 
    result = [] 
    for p in primes: 
     while n % p == 0: # while p divide n... 
      result.append(p) 
      n = n // p 
     if n <= 1: 
      break 
+0

インデントエラーと 'return result'行だけでなく、期待通りの結果が得られます。徹底的なレビューについては、[コードレビュー](https://codereview.stackexchange.com/)でお問い合わせください。直ちに改善するには、 'sqrt(n)'をループから取り出して一度だけ実行してください。また、この機能を複数回使用したい場合は、エラトステンのふるいをキャッシュすることができます。 –

+0

_n_の大きさはどれくらいですか? _n_のサイズが異なると、異なるアルゴリズムが必要になります。 – user448810

+0

Nは5983391455009以上です –

答えて

1

大きな素数のためには、Pollard's rho algorithm

from fractions import gcd 

def pollardfactor(n): 
    a=2 
    b=2 
    d=1 
    for c in [1,-1,2,3,5,7,-3,-5,-7]: 
     while True: 
      a=(a*a+c)%n 
      b=(b*b+c)%n 
      b=(b*b+c)%n 
      d=gcd(abs(a-b),n) 
      if 1 < d < n: 
       return(d) 
      elif d==n : 
       break 
    return -1 

print(pollardfactor(5983391455009)) 

これは、合理的な時間内に20桁の番号のために働くべきで実装するのは簡単で試すことができます。

+0

これは2つの素数のうち最小のものを返します。どのようにして2番目の素数を得るのですか? –

+0

分割で試す –

+0

duhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh。トックスメイト –