2017年は素数の年である

その他

22 Res. +0.53061511 MONA 2 Fav.

1 :らいう五段:2016/12/31 21:27:10 +0.30124597MONA/1人

もうすぐ2017年ですね。2017はみんな大好き素数です。
みんなで素数の美しさを共有しましょう。

2 :らいう五段:2016/12/31 21:29:20 +0MONA/0人

記念すべき
1番目にして素数の中で唯一の偶数:2

3 :名無し名誉名人:2016/12/31 22:38:17 +0.00114114MONA/1人

13+17+19+23=5+7+11+13+17+19

4 :だれかさん七段:2016/12/31 22:48:25 +0.114114MONA/1人

素数といえばPrimecoinとかいう仮想通貨があってな
素数を見付けると入手できるコインとかいう話

5 :らいう五段:2016/12/31 23:06:15 +0MONA/0人

>>3
美しい

6 :なむやん七段:2016/12/31 23:38:42 +0MONA/0人

Primecoinはモナトレで扱ってるぞい

7 :江口仙人四段:2016/12/31 23:51:33 +0MONA/0人

そーっすね

8 :名無四段:2017/01/01 22:25:58 +0MONA/0人

ですな

9 :hoyahoyamaさん:2017/01/03 01:22:57 +0MONA/0人

2017年は平成29年、皇紀2677年であり、日本では2011年以来のトリプル素数年の酉年です。
さらにピタゴラス数でもトリプルです。
西暦、皇紀に限れば、1997年/2657年から5回連続素数の最後の年です。

10 :名無し四段:2017/01/05 06:52:19 +0MONA/0人

奇跡

11 :らいう五段:2017/01/05 09:57:35 +0.114114MONA/1人

n = 1
count = 1
sum = 1
print (str(n) + "番目の素数 : 2")
n += 1
while 1 == 1:
test = 1 + (2 * count)
div = int(test / 2)
for i in range(3, div):
sum = sum * (test % i)
if sum != 0:
print (str(n) + "番目の素数 : " + str(test))
n += 1
sum = 1
count += 1

12 :らいう五段:2017/01/05 09:58:04 +0MONA/0人

Python3で素数を生成するプログラム作ってみたお ↑

13 :名無し名誉名人:2017/01/05 14:19:56 +0MONA/0人

>>11 の割り算回数を減らしてみた(C言語)
int main() {
printf("1番目の素数:2\n");
int n=2,sum=1,count=1,div=1,test=2*count+1;
while(-1){
for (int i=3; i<div; i+=2) sum=sum*(test%i);
if(sum!=0) printf("%d番目の素数:%d\n",n++,test);
sum=1;++count;test=2*count+1;
if (test==div*div){++div;++count;test=2*count+1;}
if (test>div*div) ++div;
}
}
慣れないC言語だけど、こんな感じかな?(普段はC#を使用)

14 :名無し名誉名人:2017/01/05 14:31:03 +0MONA/0人

>>13 解説
基本は>>11と同じで、最初の素数だけは偶数で、それ以降の素数は奇数なので、その性質を利用して素数を生成している。
そのため、最初の素数のみループの外で独立して生成している(…って言えるのか?これ…)
ループ内では、奇数で片っ端から剰余計算を行い、sumに掛け算している。素数でない場合は、剰余計算の結果に1つ以上0が含まれるため、掛け算結果が0でなければ素数になる。
>>11ではループを「検索値÷2」まで行っているが、>>13では「√検索値」までに短縮している。
√の計算はまじめにやらせたら時間がかかるため、擬似的に整数部分のみ計算させている。(掛け算とif分のみで形成)
また、「√検索値」が整数になった場合、素数にはなりえないのでスルーしている。

もっとうまいやり方がありそうな気もするが…どうだろうか?

15 :名無し名誉名人:2017/01/05 15:38:23 +0MONA/0人

>>13のtest=2*count+1;は
(最初のtest)test=3;
(2番目以降のtest)test+=2;
の方が軽いかね?

あ、あとif (test>div*div) ++div;はelse ifでもいい気がする。
(最初にtest==div*divに引っかかるのはtest=9のときで、次のtest=11でtest>div*divに引っかかることはない。以下25,49,81,121…になっても同じ。)

16 :らいう五段:2017/01/06 11:37:35 +0MONA/0人

>>15
なるほど
√検索値までっていう手法もあるんですね!

ちなみにですがPython3を使っているのはintegerに割り当てられるメモリがPCのスペックが許す限り限界まで拡張できることが素晴らしいと思ったからです。
Python3からはその性質上人工知能やビッグデータに向いているらしい。
そういった理由で素数でもPython3を使ってみました(4GBの数字が出るまでどれほど時間がかかることやらw)。

Cだとintegerはデフォルトで4バイトくらいでしたっけ?
拡張しても、限界が割と早めに来ちゃうのが勿体無いですよね

17 :名無し名誉名人:2017/01/06 14:06:20 +0MONA/0人

>>16
おk。8バイト(符号なし)整数に変えてみる。x64でビルドすれば計算は遅くならないはず。
あと、素数が見つかった時点でループを終了させればいいから、こんな感じかな?
int main() {
printf("1番目の素数:2\n");
unsigned long long n=2,sum=1,count=1,div=1,test=3;
while(-1){
for (unsigned long long i=3; i<div; i+=2){
if(test%i==0){printf("%llu番目の素数:%llu\n",n++,test);break;}
}
sum=1;++count;test+=2;
if (test==div*div){++div;++count;test+=2;}
if (test>div*div) ++div;
}
}

18 :名無し名誉名人:2017/01/06 16:15:56 +0MONA/0人

>>17 訂正。はやとちったな…

int main() {
printf("1番目の素数:2\n");
unsigned long long n=2,sum=1,count=1,div=1,test=3,i=3;
while(-1){
for (i=3; i<div; i+=2){
if(test%i==0) break;
}
if(i>=div)printf("%llu番目の素数:%llu\n",n++,test);
sum=1;++count;test+=2;
if (test==div*div){++div;++count;test+=2;}
if (test>div*div) ++div;
}
}

19 :名無し名誉名人:2017/01/06 19:49:10 +0MONA/0人

>>18まで書き下すと、そもそもsumとcountがいらなくなるな…

20 :削除:2017/01/08 14:58:23 +0MONA/0人

削除

21 :おぴょぴょ鯖男二段:2017/01/09 18:48:12 +0MONA/0人

怒りをコントロールする方法として、頭のなかで複雑な計算をすると、余計なことを考えなくてすむからストレスの軽減になるらしい。。。

成程、プッチ神父が「素数を数えて落ち着くんだ」と言っていたのはあながち間違いではなかったのか

22 :名無し六段:2017/01/10 15:17:04 +0MONA/0人

湯を沸かすスタンド

お気に入り

新規登録してMONAをもらおう

登録すると、投稿したり、MONAをもらったりすることができます。質問したり、答えたりしてMONAを手に入れてください。

新規登録ログイン