Julia というプログラミング言語を試してみました。Windows環境にインストールして、Jupyter Lab で実行できるようにセットアップして、素数に関する探索処理をpythonと比較して実行させてみまます。
処理内容:
1000万までの自然数に含まれる双子素数、エマープ素数、回文素数をカウントする。
探索結果と処理にかかった時間を表示する。
環境:
OS : Windows 11
CPU : Ryzen 7 5825U
MEM : 16GB
Python : 3.10.11
Julia : 1.10.4
Jupyter Lab : 4.2.4
結果:
Julia | 1.48秒 |
Python | 16.35秒 |
やはりjuliaが速いですね。pythonでもnumbaでJIT化すればC言語並みに速くなることもありますが、ライブラリ関連でエラーを起こすことが割りとあるので、手元で長時間の計算をさせる際は julia も良いですね。文法的にもpythonと似ていてスムーズに読み書きできますし。
コード:python
import sympy
import time
def get_primes_up_to(n):
return list(sympy.primerange(2, n + 1))
def is_twin_prime(prime_list):
twin_primes = []
for i in range(len(prime_list) - 1):
if prime_list[i + 1] - prime_list[i] == 2:
twin_primes.append((prime_list[i], prime_list[i + 1]))
return twin_primes
def is_emirp(prime):
reversed_prime = int(str(prime)[::-1])
return prime != reversed_prime and sympy.isprime(reversed_prime)
def is_palindrome(prime):
return str(prime) == str(prime)[::-1]
def find_special_primes(n):
primes = get_primes_up_to(n)
twin_primes = is_twin_prime(primes)
emirp_primes = [p for p in primes if is_emirp(p)]
palindrome_primes = [p for p in primes if is_palindrome(p)]
return twin_primes, emirp_primes, palindrome_primes
def save_to_file(filename, data):
with open(filename, 'w') as f:
for item in data:
f.write(f"{item}\n")
# 使用例
n = 10000000 # ここで指定した自然数までの素数を探します
start_time = time.time()
twin_primes, emirp_primes, palindrome_primes = find_special_primes(n)
end_time = time.time()
save_to_file("twin_primes.txt", twin_primes)
save_to_file("emirp_primes.txt", emirp_primes)
save_to_file("palindrome_primes.txt", palindrome_primes)
print("双子素数の個数: ", len(twin_primes))
print("エマープ素数の個数: ", len(emirp_primes))
print("回文素数の個数: ", len(palindrome_primes))
print("処理にかかった時間: ", end_time - start_time, "秒")
コード:Julia
using Primes
using Dates
function get_primes_up_to(n)
return primes(2, n)
end
function is_twin_prime(prime_list)
twin_primes = []
for i in 1:length(prime_list) - 1
if prime_list[i + 1] - prime_list[i] == 2
push!(twin_primes, (prime_list[i], prime_list[i + 1]))
end
end
return twin_primes
end
function is_emirp(prime)
reversed_prime = parse(Int, reverse(string(prime)))
return prime != reversed_prime && isprime(reversed_prime)
end
function is_palindrome(prime)
return string(prime) == reverse(string(prime))
end
function find_special_primes(n)
primes = get_primes_up_to(n)
twin_primes = is_twin_prime(primes)
emirp_primes = [p for p in primes if is_emirp(p)]
palindrome_primes = [p for p in primes if is_palindrome(p)]
return twin_primes, emirp_primes, palindrome_primes
end
function save_to_file(filename, data)
open(filename, "w") do f
for item in data
write(f, "$item\n")
end
end
end
# 使用例
n = 10000000 # ここで指定した自然数までの素数を探します
start_time = now()
twin_primes, emirp_primes, palindrome_primes = find_special_primes(n)
end_time = now()
save_to_file("twin_primes.txt", twin_primes)
save_to_file("emirp_primes.txt", emirp_primes)
save_to_file("palindrome_primes.txt", palindrome_primes)
println("双子素数の個数: ", length(twin_primes))
println("エマープ素数の個数: ", length(emirp_primes))
println("回文素数の個数: ", length(palindrome_primes))
println("処理にかかった時間: ", end_time - start_time, "秒")