[size=150][b][size=150]このワークシートは[url=https://www.geogebra.org/m/twxxx3yq]Math by Code[/url]の一部です。[br][/size][/b][b][br]<レプ・ユニット素数ってなんだっけ?>[br][br]レプ・ユニット数は、反復する1、つまり、repeatedUnitsの略した言い方。[br]レプ・ユニット素数はどのくらいあるでしょう。[br][/b][b]111=999/9=(1000-1)/9=(10^3-1)/9と表せるように、[br]一般に(10^n-1)/9で111...1のように1だけが並ぶ整数が作れます。[br]nが9973以下では、n=2,19,23,317,1031の5個だけだといわれています。[br]実験してみましょう。[br][br]juliaで素数判定関数をまた使います。次に、juliaでn=9999までの整数に対して[br]レプ・ユニット数(10^n-1)/9に素数filterをかけよう。[br][br][/b][color=#0000ff][IN]julia[br][/color][/size][color=#0000ff]#======================[br][/color]N=[x for x in 2:30][br]Rp=map(n->(n,((10^n-1)÷9)),N)[br]println(N)[br]println(Rp)[br][color=#0000ff]#======================[br][OUT][br][/color][color=#ff0000][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][br][(2, 11), (3, 111), (4, 1111), (5, 11111), (6, 111111), (7, 1111111), (8, 11111111), (9, 111111111), (10, 1111111111), (11, 11111111111), (12, 111111111111), (13, 1111111111111), (14, 11111111111111), (15, 111111111111111), (16, 1111111111111111), (17, 11111111111111111), (18, 111111111111111111), (19, -938527119301061290), (20, 862919959050249102), (21, 430646668853801415), (22, 207190227713669347), (23, 22264046724521073), (24, 222640467245210737), (25, 176766442039934975), (26, -281973810012822641), (27, -770099869716054016), (28, 497554224488149447), (29, 876265784057149667), (30, 564104918922807068)][br][/color][br]<参考>[br](・[b][color=#0000ff]素数リスト[/color][/b]の作り方、[color=#0000ff][b]素数判定[/b][/color]については[url=https://www.geogebra.org/m/jxmueqdt]こちら、[br][/url] ・リストに[color=#0000ff][b]filterをかける方法[/b][/color]については[url=https://www.geogebra.org/m/vre8rh6h]こちら[/url])[br]残念なら桁溢れが19けたで起きている。[br][b]juliaの整数intは19ケタが限界なので、[br]BigInt()を使って、ケタの限界をこえるように改造しよう。[br][/b][br]1が3の倍数個あると3の倍数になるからとばそう。[br]1が2より大きい偶数個(2n)あると、左右にわけた1がn個ならんだ数の倍数になるからとばそう。[br]いやいや、[br]それだけではない。[br]また、m,nに対するレプ・ユユニット数Rm,Rnがあるとき、mがnの倍数ならば、RmはRnの倍数になる。[br]すると、mが合成数ならば、Rmはmの因子nのRnを因数にもつから、合成数になる。[br]レプユニット素数Rpを探すには、pが素数であることは必要だが、十分でなない。[br]これって、メルセンヌ素数と同様に、mが素数であることは必要だが十分ではないときと同じだね。[br][b][color=#0000ff][u][size=150]質問:m,nに対するレプ・ユユニット数Rm,Rnがあるとき、mがnの倍数ならば、RmはRnの倍数になる。これはどうやって証明しますか。[br][/size][/u][/color][/b][color=#0000ff][br]レプユニット素数の候補数をならべよう。[br]Pythonの場合はJuliaより無名関数やmap,filterでリストを作ると、記述が長めになる。[br]だから、約数個数を求める関数divCountを作って、1行に詰め込みすぎないようにしよう。[br]2から100までの整数のリストMで、dicCountが2個になる整数Pが素数のリストとなる。[br]素数個の1を並べることで、レプ・ユニット素数の候補ができる。[br]#[IN]Python[br]#=================================[br][/color]M=list(range(2,100))[br]divCount=lambda n:len(list(filter(lambda m:n % m==0, list(range(1,n+1)))))[br]P=[x for x in M if divCount(x)==2][br]Rp=list(map(lambda n:(n,((10**n-1)//9)),P))[br]print(P)[br]print(Rp)[br]#==================================[br][br][color=#0000ff]Juliaでは、divcountを関数にしなくても、filterの中の無名関数で簡単にかける。[br]#[IN]Julia[br]#=================================[br][/color]P=filter(n->length(filter( m -> n % m==0,1:n))==2, 2:100) [br][color=#0000ff]#べき乗のBigInt()は底につける。[/color][br]Rp=map(n->(n,(BigInt(10)^n-1)÷BigInt(9)), P)[br]println(P)[br]println(Rp)[br]#=================================[br][[color=#45818e]OUT][br][2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97][br][(2, 11), [br](3, 111), [br](5, 11111), [br](7, 1111111), [br](11, 11111111111), [br](13, 1111111111111), [br](17, 11111111111111111), [br](19, 1111111111111111111), [br](23, 11111111111111111111111), [br](29, 11111111111111111111111111111), [br](31, 1111111111111111111111111111111), [br](37, 1111111111111111111111111111111111111), [br](41, 11111111111111111111111111111111111111111), [br](43, 1111111111111111111111111111111111111111111), [br](47, 11111111111111111111111111111111111111111111111), [br](53, 11111111111111111111111111111111111111111111111111111), [br](59, 11111111111111111111111111111111111111111111111111111111111), [br](61, 1111111111111111111111111111111111111111111111111111111111111), [br](67, 1111111111111111111111111111111111111111111111111111111111111111111), [br](71, 11111111111111111111111111111111111111111111111111111111111111111111111), [br](73, 1111111111111111111111111111111111111111111111111111111111111111111111111), [br](79, 1111111111111111111111111111111111111111111111111111111111111111111111111111111), [br](83, 11111111111111111111111111111111111111111111111111111111111111111111111111111111111), [br](89, 11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111), [br](97, 1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111)][br]100以下のレプ・ユニット素数の候補が即座に表示できた。[br]juliaのいいところは,mapやfilterのリストへの操作が簡潔にかけるところだ。[br]デメリットはPythonのように、何もしなくても多桁(多倍長整数)対応になるわけではなく、[br]BigIntでくるむ必要があるため、可読性が落ちることだね。[br][/color]2007年までに9個しか見つかっていないらしい。[br][br]pythonで検証してみる。[br]2,19の2個だけで数分かかる。[br]次は23の1個だけでもかなり時間がかかる。[br]317を見つけるには何かしら手段をさらに工夫が必要となりそうだ。[br][IN]Python[br]#===========================================================[br]def isPrime(n):[br] lim = int(round(n**0.5))[br] for num in range(2,lim):[br] if n % num ==0: [br] return False[br] return True[br]M=list(range(2,20))[br]divCount=lambda n:len(list(filter(lambda m:n % m==0, list(range(1,n+1)))))[br]P=[x for x in M if divCount(x)==2][br]R=list(map(lambda n:(n,((10**n-1)//9)),P))[br]Rp=list(filter(lambda n:isPrime((10**n-1)//9),P))[br]print(P)[br]print(R)[br]print(Rp)[br]#===========================================================[br][2, 3, 5, 7, 11, 13, 17, 19][br][(2, 11), (3, 111), (5, 11111), (7, 1111111), (11, 11111111111), (13, 1111111111111), (17, 11111111111111111), (19, 1111111111111111111)][br][2, 19][br][br]geogebraではn=19けた以上は探さずに終了している。[br]n=19というので、juliaが19けたが桁溢れしたことを思い出すね。[br]juliaでも同様なコードをかいて実行しても、時短にはならなかった。残念。[br][br][color=#0000ff][b][u][size=150]質問:juliaでn=19までのレプ・ユニット素数を検索するにはどうかいたらよいでしょうか。[/size][/u][/b][/color]