素因数分解アルゴリズム: C, Python 例:

⚡ スマートサマリー

素因数分解アルゴリズムは、平方根までの試行除算、または最小の素因数をそれぞれ格納するエラトステネスの篩の変形を用いて、任意の正の整数を素数の積に分解します。

  • 🧮 定義: 整数の素因数とは、積がその整数と等しくなる素数のことです。例えば、10は2と5に分解できます。
  • 🔁 裁判部門: 2からsqrt(n)まで繰り返し、剰余がゼロのときに割り算を行う処理はO(sqrt(n))の時間で実行されます。
  • 🧰 ふるい分け法: 上限までのすべての値に対して最小の素因数を格納することで、因数分解をクエリあたり約 O(log n) に削減できます。
  • 🐍 Python Code: 反復的かつ再帰的 Python 実装によっては、入力された数値の各素因数を出力します。
  • 💻 C Code: 反復型および再帰型のCプログラムを照合することで、stdioと事前計算された配列を使用して同じロジックを実証する。
  • 🔐 用途: 素因数分解は、割り算の判定、分数の簡略化、共通分母の算出、および数値ベースの暗号鍵の生成に用いられる。

素因数アルゴリズム

素因数分解とは何ですか?

数の素因数とは、それ自体が 素数1とそれ自身以外では割り切れない。

例: 10の素因数は2と5です。なぜなら、2 × 5 = 10だからです。

反復を使用して素因数を見つける

2からsqrt(n)までを繰り返し、割り切れるかどうかを確認します。nが現在の候補で割り切れる限り、割り算を実行して出力します。

例: 40より大きいすべての素数はnに適合する2+n+41なので、n = 0、1、2の場合、41、43、47が得られます。

数値の素因数を出力するにはどうすればよいですか?

  • 2からsqrt(n)までの数値を繰り返します。
  • 各候補に対してnの法則を調べます。余りがゼロであれば、その候補は素因数です。
  • nを割り切るすべての素数を集めます。
  • このルーチンはO(sqrt(n))の時間計算量で実行されます。

アルゴリズム:

Set a counter i to 2
While i <= sqrt(n):
    While n % i == 0:
        n = n / i
        print i
    i = i + 1
if n > 1:
    print n

ふるいアルゴリズム

篩法は、最大上限までのすべての数の最小の素因数を格納し、事前計算後に素因数分解のコストを大幅に削減します。

  • 最大制限までのすべての整数の最小の素因数を記録します。
  • その最小の素数を取り出して、因数集合に加えます。
  • その数をその素数で割り、1になるまで繰り返します。
  • 各クエリの実行時間は約O(log n)です。

例: 2と3以外の素数は、6n-1または6n+1の形に収まります。例えば、5 = 6(1)-1、19 = 6(3)+1です。

アルゴリズム: 定義する 配列 各数値の最小の素因数を格納し、インデックスを各要素の初期値として使用します。

Set array[1] to 1
Set i to 2
While i*i <= max_number:
    If array[i] == i:
        Set j to i*i
        While j <= max_number:
            If array[j] == j:
                array[j] = i
            j = j + i
    i = i + 1
while the_number != 1:
    print array[the_number]
    the_number = the_number / array[the_number]

関連記事

Python 反復法を使った素因数分解

以下 Python このコードは、反復試行除算法を用いて素因数を求めます。

import math
def PrimeFactors(n):
    for i in range(2, int(math.sqrt(n)) + 1, 1):
        while n % i == 0:  # find all the occurrences of a prime factor
            print((int)(i))
            n = n // i
    if n != 1:  # if the number was originally a prime
        print((int)(n))
n = (int)(input("Enter the number you want: "))
PrimeFactors(n)

出力:

Enter the number you want: 4
2
2

Python 再帰を使った素因数分解

その Python 以下のコードは、篩法を用いて与えられた数の素因数を求めます。

import math
High = (int)(1e5 + 7)
array = [0 for i in range(High)]

# generate smallest prime factors
def Sieve():
    for i in range(1, High):
        array[i] = i
    for i in range(2, math.ceil(math.sqrt(High))):
        if array[i] == i:
            for j in range(i * i, High, i):
                if array[j] == j:
                    array[j] = i

def PrimeFactors(n):  # divide until we reach 1
    if n == 1:
        return
    print((int)(array[n]))
    PrimeFactors((int)(n / array[n]))

Sieve()
n = (int)(input("Enter the number you want: "))
PrimeFactors(n)

出力:

Enter the number you want: 4
2
2

反復を使用した C 素因数プログラム

同じ反復解法が C数値を入力し、2からsqrt(n)までの各候補について割り切れるかどうかをチェックし、素因数のすべての出現箇所を出力します。

#include <stdio.h>
int main()
{
    int n;
    printf("Enter the number you want: ");
    scanf("%d", &n);
    for (int i = 2; i * i <= n; i++)
    {
        while (n % i == 0)  // find all the occurrences of a prime factor
        {
            printf("%d\n", i);
            n /= i;
        }
    }
    if (n != 1)  // if the number was originally a prime
    {
        printf("%d", n);
    }
    return 0;
}

出力:

Enter the number you want: 2
2

再帰を使用した C 素因数プログラム

再帰を使用した C 素因数プログラム

再帰的なCバージョンは Python 1:最小の素因数の配列を作成し、nが1になるまでその素因数で割り続ける。

#include <stdio.h>
int Max = 100007;
int array[100007];

void Sieve()  // smallest prime factors up to Max
{
    for (int i = 1; i < Max; i++)
        array[i] = i;
    for (int i = 2; i * i <= Max; i++)
    {
        if (array[i] == i)
        {
            for (int j = i * i; j < Max; j += i)
            {
                if (array[j] == j)
                    array[j] = i;
            }
        }
    }
}

void PrimeFactors(int n)
{
    if (n == 1)  // divide until we reach 1
        return;
    printf("%d\n", array[n]);
    PrimeFactors(n / array[n]);
}

int main()
{
    Sieve();
    int n;
    printf("Enter the number you want: ");
    scanf("%d", &n);
    PrimeFactors(n);
    return 0;
}

出力:

Enter the number you want: 2
2

素数に関する興味深い事実

  • 2以外の偶数は、2つの素数の和として表すことができる(4 = 2 + 2、6 = 3 + 3、8 = 5 + 3)。
  • 2と3以外に連続する素数は存在しない。なぜなら、2は唯一の偶数の素数だからである。
  • 2と3を除くすべての素数は、6n + 1または6n − 1の形に当てはまります。ここでnは正の整数です。
  • ある数の素因数の集合は一意である。
  • 1は素数でも合成数でもない。
  • 素因数分解は、割り算の判定、分数の簡略化、共通分母の探索に役立ちます。
  • 素因数分解は、数値に基づく暗号コードの基礎も担っている。

よくあるご質問

素因数分解とは、整数を素数の積に分解することです。例えば、12 = 2 × 2 × 3 となります。1より大きいすべての整数に対して、素因数は一意に定まります。

nがsqrt(n)より大きい因数を持つ場合、その因数はより小さく、既に見つかっているはずです。sqrt(n)を超える因数は、同じ処理を繰り返すことになります。

試行除算はO(sqrt(n))の時間で実行されます。篩は最小の素因数をO(N log log N)の時間で事前に計算し、各素因数分解を約O(log n)の時間で実行します。

既知の上限値内で多数の数を因数分解する場合、篩法を使用します。一度事前計算を行うことで、以降の各クエリの実行時間を約 O(log n) に短縮できます。

いいえ。1は素数でも合成数でもないので、素因数分解のリストには登場しません。素因数分解では、2以上の素数を使用します。

素因数分解は、割り算の判定、分数の簡略化、最小公倍数と最大公約数、そしてRSAのような公開鍵暗号方式の基盤となるものであり、RSAでは2つの素数の大きな積を素因数分解することが困難である。

AIシステムは、素因数分解を数論的特徴、暗号鍵解析、および安全な連合学習に適用する。ポスト量子機械学習の研究では、素因数分解耐性についても研究されている。

はい。GitHub Copilotや同様のAIアシスタントは、試行除算や篩分けルーチンの定型コードを自動化しますが、開発者は依然として複雑さやn=1などのエッジケースを検証する必要があります。