素数判定・素因数分解プログラム


素数判定プログラム  prime.bas
「(仮称)十進BASIC」上で素数判定をするプログラムで,試行除算とミラー・ラビン素数判定法を用いています。素数でない数 を素数と誤判定する確率は1回の判定に対して2-200以 下に設定しています。同じ素数に対してn回判定を繰り返せば,誤判定する確率は2-200n以 下になりますから,素数であるかどうかをほぼ確実に判定できます。最新の「(仮称)十進BASIC」をダウンロードしてからご利用下さい。
また,プログラムを少し変形して,試行除算で素数の一覧表を作りました。他のサイト 「www.ysr.net.it-chiba.ac.jp/yashiro/sosu/」の一覧表と一致することを,「暗GO」にあるファイルのハッシュ 値を得る機能で確認しました。
素因数分解プログラム  factor.bas
上記の素数判定プログラムに,ポラードのρ素因数分解法(Pollard's rho algorithm)を 加えて,素因数分解が出来るようにしたものです。
ρ素因数分解法は,小さい素因数を高速に見つけますが,大きな素因数を見つけるのには向きません。フェルマー数のF8までは素因数分解できましたが,15 桁未満の素因数の検出に適するかと思われます。
フェルマー数のF8まで素因数分解できます。試してみて下さい。
また,ブレント(Brent)が,ρ法を高速化するために変形アルゴリズムを作成しています。そのブレントのアルゴリズムに,さらに独自の改良を加えてみ ました。平均すると僅かですが1割近く高速になります。

ポラードのρ素因数分解法は,次の上下に並んだ添字の項の差を用います。下の行が空白の場合は,用いません。添字の差は,1,2,3,……と 連続します。

ポラードの元のアルゴリズムでは,一度計算した項を記憶すること は記 憶容量の関係で不可能なので,上の列と下の列を添字に持つ乱数列を同時に2本生成し ま す。
1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
   1     2     3     4     5     6     7     8     9    10    11    12    13    14    15    16    17    18    19    20    21    22    23    24    25

ブレントによる変形アルゴリズム
は,次の上下に並んだ添字の項の差を利用します。この場合,既に生成した項を1項だけ記憶することにより,乱数列 を1本だけしか生成しないで済みます。
1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
   1     2        4  4              8  8  8  8                         16 16 16 16 16 16 16 16                                                 32 32

ブレントの方法に改良を加えたアルゴリズムは,次の上下に並んだ 添字の項の差を利用します。既に生成した項を何項か記憶することによ り,若干の高速化を図ったもので
4項 だけ記憶する場合は
1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
            4  4  4  4     5     6     7     8       10 10       12 12       14 14       16 16             20 20 20 20             24 24 24 24
8項だけ記憶する場合は
1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
                        8  8  8  8  8  8  8  8     9    10    11    12    13    14    15    16       18 18       20 20       22 22       24 24

最初のページ に戻る