python質数を求める3つの方法

1713 ワード

本論文ではいろいろな方法を共有しました。python実現コードを求めて、参考にしてください。具体的な内容は以下の通りです。
問題の要求はn以下の素数の個数を求めることです。
素数を求める方法1:
貧しいやり方:
定義サイクルによってこの数を彼より小さい自然数(1より大きい)で割ったと判断します。彼によって割り切れるものがあれば、素数ではありません。

def countPrimes1(self, n):
  """
  :type n: int
  :rtype: int
  """
  if n<=2:
   return 0
  else:
   res=[]
  for i in range(2,n):
   flag=0 #     ,=0    
   for j in range(2,i):
    if i%j ==0:
     flag=1
   if flag==0:
    res.append(i)
  return len(res)
素数を求める方法2:
定理を利用します。一つの数が合数なら、その最小素因数はきっとその平方根より小さいです。したがって、一つの数が素数かどうかを判断すると、その素数が開いた後の全部の数より小さいかどうかを判断するだけでよい。このようにすると演算が少なくなります。

 def countPrimes2(self, n):
  if n<=2:
   return 0
  else:
   res=[]
  for i in range(2, n):
   flag=0
   for j in range(2, int(math.sqrt(i))+1):
    if i % j == 0:
     flag = 1
   if flag == 0:
    res.append(i)
  return len(res)

素数を求める方法3:
定理を利用します。一つの数が合数なら、その最小素因数はきっとその平方根より小さいです。試みが平方根のすべての数より小さいなら大丈夫であることが分かります。3からルートxまでのすべての数を列挙するのは、やはりもったいない。例えば、101が素数かどうかを判断するには、101のルート番号を調整してから10です。試したい数は1から10です。しかし、9に対する試みは無駄であることがわかった。3で割り切れないと、必ず9で割り切れません。この考えに沿って歩き続けます。実は、ルートxより小さい素数を試していけばいいです。これらの素数は、ちょうど前に計算されています。すでにresの中にあります。

 def countPrimes3(self, n):
  if n <= 2:
   return 0
  else:
   res = []
  for i in range(2, n):
   flag = 0
   for j in res:
    if i % j == 0:
     flag = 1
   if flag == 0:
    res.append(i)
  return len(res)
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。