どうも、木村(@kimu3_slime)です。
今回は、Julia(Primes)で素数判定、素因数分解する方法を紹介します。
準備
Primes.jlを使うので、持っていなければインストールしておきましょう。
1 2 | using Pkg Pkg.add("Primes") |
準備として、以下のコードを実行しておきます。
1 | using Primes |
素数判定、素因数分解する方法
「isprime(整数)」で、整数が素数かどうか、trueかfalseで返してくれます。
1 | isprime(53) |
「factor(整数)」で、整数を素因数分解できます。
1 2 | isprime(57) factor(57) |
手計算では素数判定するのが難しい大きな数でも、素早く計算してくれます。
1 2 3 | factor(2021) factor(202112271521) factor(factorial(20)) |
大きな整数を扱うには、BigIntを使わないとオーバーフローしてしまいます。
1 2 3 | @time factor(BigInt(2)^(100)-1) @time factor(BigInt(2)^(120)-1) @time factor(BigInt(2)^(150)-1) |
大きな数ほど素因数分解には時間がかかり、現実的な時間で解けるものには限りがあります。
「primes(a,b)」は、a以上b以下の素数をベクトルとして返し、素数の一覧が得られます。
1 | primes(1,50) |
「length(ベクトル)」でベクトルのサイズを測れば、特定の範囲にある素数の個数、数え上げの問題が解けます。
1000以下の素数は250個以下であることを示せ。
(2021年一橋大学 前期第1問)
1 | length(primes(1,1000)) |
与えられた自然数\(n\)に対し、それ以下の素数の個数を返す関数(素数カウント関数)は、\(\pi(n)\)と表される数論的関数として有名です。
ディリクレの素数定理によると、\(4n+1\)、\(4n+3\)の形の等差数列は、それぞれ無限に多くの素数を含むことが知られています。これが正しいかどうか、素数判定の関数isprmeを使って、部分的に確かめてみましょう。
与えられた配列に対し、その要素が素数かどうかを判定する関数を定義します。
1 2 3 4 5 | function arrayisprime(a) for i in a println(string(i)," ",isprime(i)) end end |
これを使って、素数が含まれているか確認してみましょう。
1 | arrayisprime([4*i+3 for i in 40:50]) |
1 2 3 4 5 6 7 8 9 10 11 | 163 true 167 true 171 false 175 false 179 true 183 false 187 false 191 true 195 false 199 true 203 false |
1 | arrayisprime( [4*i+3 for i in 1000:1010]) |
1 | arrayisprime([4*i+1 for i in 1000:1010]) |
1 | arrayisprime( [4*i+1 for i in 10000:10010]) |
trueがいくつか含まれていて、確かに無数に素数を含んでいそうですね。
以上、Julia(Primes)で素数判定、素因数分解する方法を紹介してきました。
大きな数の素数判定、素因数分解は、エラトステネスの篩(試し割り)で手計算で行うには時間がかかりすぎます。コンピュータである程度の速さで計算してくれるのは嬉しいですね。
木村すらいむ(@kimu3_slime)でした。ではでは。
コロナ社 (2020-03-26T00:00:01Z)
¥7,353 (コレクター商品)
こちらもおすすめ
Julia(SymPy)で多項式の展開・因数分解、方程式を解く方法