メインコンテンツまでスキップ

素数攻略ガイド: 数字の正体を見破ろう

素数は、1と自分自身でしか割り切れない数です。

Code Recipeでは、素数を「判定する」「まとめて見つける」「分解する」の3つに分けて攻略します。

【基本】試し割り法

巨大な数字の正体を、最小限の努力で見破ろう。

試し割り法は、2, 3, 4... と順番に割れるかを調べる素数判定です。

ただし、1億まで全部試す必要はありません。調べるのは sqrt(N) までで十分です。

なぜなら、もし N = A × B と分解できるなら、AB のどちらかは必ず sqrt(N) 以下になるからです。両方とも sqrt(N) より大きいと、かけ算した結果が N を超えてしまいます。

試し割りの図

試し割りのコード

def is_prime(n):
if n < 2:
return False

divisor = 2
while divisor * divisor <= n:
if n % divisor == 0:
return False
divisor += 1

return True


print(is_prime(97))

AOJで挑戦してみよう!

数値が大きいので、この「試し割り」レシピが必須です。

まとめて素数を見つけたいとき

範囲内の素数をまとめて数えたり、何度も素数判定をしたりするなら、試し割りよりも エラトステネスの篩 が向いています。

「2の倍数を消す」「3の倍数を消す」という具体的な動き、表での図解、篩を使うAOJ問題は専用ページにまとめています。

【分析】素因数分解

すべての数字は「素数」というブロックでできている。

素因数分解は、数字を素数のかけ算に分解する方法です。

たとえば、602 × 2 × 3 × 5 に分解できます。試し割り法を応用して、割れる素数で何度も割っていくのが基本です。

詳しい手順は、素因数分解 のページで確認できます。

素因数分解のコード

def factorize(n):
factors = []
divisor = 2

while divisor * divisor <= n:
while n % divisor == 0:
factors.append(divisor)
n //= divisor
divisor += 1

if n > 1:
factors.append(n)

return factors


print(factorize(84))

AOJで挑戦してみよう!

数字を素数のブロックに分けて、構造を読み解こう。