(剰余n、原始根の個数、原始根のリスト)を返す、関数primitiveRoot(n)を作ることができる。[br]100以下の素数に対して、原始根のリストを表示してみよう。[br][br][color=#0000ff]#[IN]julia[br]#=====================================================================[br]#素数判定関数[br]function isPrime(n)[br] lim = Int(round(n^0.5))[br] if n<2[br] return false[br] end[br] for num in 2:lim[br] if n % num ==0 [br] return false[br] end [br] end[br] return true[br]end[br]#オイラー関数[br]function eu(n)[br] divs=filter( m -> n % m==0,1:n) #nの約数リスト[br] ps= filter(p -> isPrime(p),divs) #nの素因数リスト[br] zs= [1-1/x for x in ps] #素数の倍数を除く割合リスト[br] return Int(n *prod(zs))[br]end[br]#素数nの原始根を求める関数[br]function primitiveRoot(n)[br] q=n-1[br] divs=filter( m -> q % m==0,1:q) #qの約数リスト[br] ps= filter(p -> isPrime(p),divs) #qの素因数リスト[br] ids = [q÷x for x in ps] #テスト用の指数リスト[br] rems = [ x for x in 1:q] #テスト対象の剰余リスト[br] #powermodが1になるものを抜き出すために−1して積が0になると除外する。[br] tested=[prod([powermod(x,id,n)-1 for id in ids]) for x in rems] [br] #非ゼロになるインデックスが原始根となる。[br] return findall(!iszero,tested)[br]end[br][br]P =filter(n->length(filter( m -> n % m==0,1:n))==2, 5:100) [br]pp=[(x,eu(x),primitiveRoot(x)) for x in P][br][br][/color][color=#0000ff]#=====================================================================[br][OUT][br][/color]23-element Vector{Tuple{Int64, Int64, Vector{Int64}}}:[br] (5, 4, [2, 3])[br] (7, 6, [3, 5])[br] (11, 10, [2, 6, 7, 8])[br] (13, 12, [2, 6, 7, 11])[br] (17, 16, [3, 5, 6, 7, 10, 11, 12, 14])[br] (19, 18, [2, 3, 10, 13, 14, 15])[br] (23, 22, [5, 7, 10, 11, 14, 15, 17, 19, 20, 21])[br] (29, 28, [2, 3, 8, 10, 11, 14, 15, 18, 19, 21, 26, 27])[br] (31, 30, [3, 11, 12, 13, 17, 21, 22, 24])[br] (37, 36, [2, 5, 13, 15, 17, 18, 19, 20, 22, 24, 32, 35])[br] (41, 40, [6, 7, 11, 12, 13, 15, 17, 19, 22, 24, 26, 28, 29, 30, 34, 35])[br] (43, 42, [3, 5, 12, 18, 19, 20, 26, 28, 29, 30, 33, 34])[br] (47, 46, [5, 10, 11, 13, 15, 19, 20, 22, 23, 26 … 31, 33, 35, 38, 39, 40, 41, 43, 44, 45])[br] (53, 52, [2, 3, 5, 8, 12, 14, 18, 19, 20, 21 … 32, 33, 34, 35, 39, 41, 45, 48, 50, 51])[br] (59, 58, [2, 6, 8, 10, 11, 13, 14, 18, 23, 24 … 40, 42, 43, 44, 47, 50, 52, 54, 55, 56])[br] (61, 60, [2, 6, 7, 10, 17, 18, 26, 30, 31, 35, 43, 44, 51, 54, 55, 59])[br] (67, 66, [2, 7, 11, 12, 13, 18, 20, 28, 31, 32, 34, 41, 44, 46, 48, 50, 51, 57, 61, 63])[br] (71, 70, [7, 11, 13, 21, 22, 28, 31, 33, 35, 42 … 55, 56, 59, 61, 62, 63, 65, 67, 68, 69])[br] (73, 72, [5, 11, 13, 14, 15, 20, 26, 28, 29, 31 … 42, 44, 45, 47, 53, 58, 59, 60, 62, 68])[br] (79, 78, [3, 6, 7, 28, 29, 30, 34, 35, 37, 39 … 54, 59, 60, 63, 66, 68, 70, 74, 75, 77])[br] (83, 82, [2, 5, 6, 8, 13, 14, 15, 18, 19, 20 … 62, 66, 67, 71, 72, 73, 74, 76, 79, 80])[br] (89, 88, [3, 6, 7, 13, 14, 15, 19, 23, 24, 26 … 63, 65, 66, 70, 74, 75, 76, 82, 83, 86])[br] (97, 96, [5, 7, 10, 13, 14, 15, 17, 21, 23, 26 … 71, 74, 76, 80, 82, 83, 84, 87, 90, 92])[br]