どうも、木村(@kimu3_slime)です。
今回は、Juliaで平方数、ピタゴラス数、双子素数を求める方法を紹介します。
準備
Primesを使うので、持っていなければインストールしておきましょう。
1 2 | using Pkg Pkg.add("Primes") |
準備として、以下のコードを実行しておきます。
1 | using Primes |
平方数
次のようにすれば、平方数(ある整数の2乗で表される整数)が求められます。
1 | [a^2 for a=1:10] |
1 2 3 4 5 6 7 8 9 10 11 | 10-element Vector{Int64}: 1 4 9 16 25 36 49 64 81 100 |
これは配列の内包記法(comprehension)と呼ばれる書き方です。
「[a^2 for a=1:10]」は、「a^2 を成分とする配列を作る、ただしaは1以上10以下の整数」という意味ですね。
さらにif文を加えると、条件を満たす数を集めることができます。「if 1000<= a^2 <= 2000」でaは1000以上2000以下です。
1 | [a^2 for a=1:1000 if 1000<= a^2 <= 2000] |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 13-element Vector{Int64}: 1024 1089 1156 1225 1296 1369 1444 1521 1600 1681 1764 1849 1936 |
if文において「&」(かつ)を加えて、条件を増やせます。「rem(a,2)」はaを2で割ったあまり、「rem(a,2) !==0」は2で割ってあまり0でない、つまり奇数の平方数を求められます。
1 | [a^2 for a=1:1000 if (1000<= a^2 <= 2000)& rem(a,2) !==0] |
1 2 3 4 5 6 7 | 6-element Vector{Int64}: 1089 1225 1369 1521 1681 1849 |
ピタゴラス数
\(a^2 +b^2 = c^2\)を満たす正の整数の組\((a,b,c)\)を、ピタゴラス数、ピタゴラスの3つ組(Pythagorean triple)と呼びます。
その一覧を求めてみましょう。「(a,b,c)」で3つ組を表せます。
1 | [(a,b,c) for a=1:15,b=1:15,c=1:15 if a^2+b^2==c^2] |
1 2 3 4 5 6 7 8 9 | 8-element Vector{Tuple{Int64, Int64, Int64}}: (4, 3, 5) (3, 4, 5) (8, 6, 10) (6, 8, 10) (12, 5, 13) (5, 12, 13) (12, 9, 15) (9, 12, 15) |
\((6,8,10)\)と\((8,6,10)\)は、\(a,b\)を入れ替えただけで実質1つです。\(a\leq b\)という条件を加えても、ピタゴラス数は変わらずに求められます(一般性を失わない)。
1 2 | n = 50 [(a,b,c) for a=1:n,b=1:n,c=1:n if a^2+b^2==c^2 & a<=b] |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | 20-element Vector{Tuple{Int64, Int64, Int64}}: (3, 4, 5) (6, 8, 10) (5, 12, 13) (9, 12, 15) (8, 15, 17) (12, 16, 20) (15, 20, 25) (7, 24, 25) (10, 24, 26) (20, 21, 29) (18, 24, 30) (16, 30, 34) (21, 28, 35) (12, 35, 37) (15, 36, 39) (24, 32, 40) (9, 40, 41) (27, 36, 45) (30, 40, 50) (14, 48, 50) |
さらに、\((6, 8, 10)\)は\((3, 4, 5)\)のそれぞれの2倍になっています。\((a,b,c)\)がピタゴラス数ならば、それぞれを整数倍した\((ka,kb,kc)\)もピタゴラス数です。
\((6, 8, 10)\)のようなケース、それぞれの数が互いに素でないときは原始的(primitive)でないと呼ばれます。\((3,4,5)\)は原始的(互いに素)です。
Juliaでは、最大公約数が1に等しい「gcd(a,b,c) ==1」で、互いに素であることを判定できます。
1 2 | gcd(3,4,5) == 1 gcd(6,8,10) == 1 |
1 2 | true false |
きちんと原始性の判定ができています。これを使って、原始的なピタゴラス数の一覧を求めてみましょう。
1 2 3 | n = 100 [(a,b,c) for a=1:n,b=1:n,c=1:n if a^2+b^2==c^2 & a<=b & gcd(a,b,c) == 1] |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 16-element Vector{Tuple{Int64, Int64, Int64}}: (3, 4, 5) (5, 12, 13) (8, 15, 17) (7, 24, 25) (20, 21, 29) (12, 35, 37) (9, 40, 41) (28, 45, 53) (11, 60, 61) (33, 56, 65) (16, 63, 65) (48, 55, 73) (36, 77, 85) (13, 84, 85) (39, 80, 89) (65, 72, 97) |
双子素数
「primes(a,b)」で、a以上b以下の素数の配列が得られます。
1 | [p for p in primes(1,10)] |
1 2 3 4 5 | 4-element Vector{Int64}: 2 3 5 7 |
これを応用して、差が2であるような素数:双子素数(twin prime)を求めてみましょう。
1 2 | n=500 [(p,q) for p in primes(1,n) ,q in primes(1,n) if q-p==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 | 24-element Vector{Tuple{Int64, Int64}}: (3, 5) (5, 7) (11, 13) (17, 19) (29, 31) (41, 43) (59, 61) (71, 73) (101, 103) (107, 109) (137, 139) (149, 151) (179, 181) (191, 193) (197, 199) (227, 229) (239, 241) (269, 271) (281, 283) (311, 313) (347, 349) (419, 421) (431, 433) (461, 463) |
「双子素数が無限に存在するか」という数学的な問題は、2022年時点では、未解決問題として知られています。
以上、Juliaで平方数、ピタゴラス数、双子素数を求める方法を紹介してきました。
配列の内包記法を使えば、さまざまな条件を満たす整数の一覧を求められます。コンピュータならば条件を満たす数を探すのは簡単なので、いろいろ試してみると面白いですね。
木村すらいむ(@kimu3_slime)でした。ではでは。
コロナ社 (2020-03-26T00:00:01Z)
¥7,353 (コレクター商品)
こちらもおすすめ
一般性を失わない(without loss of generality)とは、例