素数生成

 投稿者:GAI  投稿日:2014年 7月17日(木)22時20分0秒
  以下のアルゴリズムで素数を全て見つけることができるという。

1.赤コインを2枚と青コイン1枚をすべて裏向きに置く
2.赤青どちらかが全部表になるまで任意の赤と青を1枚ずつ(計2枚)を同時にひっくり返す
3A.青が先に全部表を向いたときには青を全て裏返して2に戻る
3B.赤が先に全部表になったときには青コインを1枚減らし全て裏返して2に戻る
3C.青赤同時に全部表になったときには各コインの枚数を何らかの方法で出力し、赤コインを1枚増やし、青コインをそれより1枚少ない枚数にして全て裏返し2に戻る
4.必要なだけ繰り返した後、出力から青コインの枚数が1枚となっているときの赤コインの枚数を抽出する

この動きをモニターすることができるプログラムを作って頂きたい。
 

Re: 素数生成

 投稿者:山中和義  投稿日:2014年 7月18日(金)06時41分57秒
  > No.3437[元記事へ]

GAIさんへのお返事です。

> 以下のアルゴリズムで素数を全て見つけることができるという。
>
> 1.赤コインを2枚と青コイン1枚をすべて裏向きに置く
> 2.赤青どちらかが全部表になるまで任意の赤と青を1枚ずつ(計2枚)を同時にひっくり返す
> 3A.青が先に全部表を向いたときには青を全て裏返して2に戻る
> 3B.赤が先に全部表になったときには青コインを1枚減らし全て裏返して2に戻る
> 3C.青赤同時に全部表になったときには各コインの枚数を何らかの方法で出力し、赤コインを1枚増やし、青コインをそれより1枚少ない枚数にして全て裏返し2に戻る
> 4.必要なだけ繰り返した後、出力から青コインの枚数が1枚となっているときの赤コインの枚数を抽出する
>
> この動きをモニターすることができるプログラムを作って頂きたい。

自分自身を除く最大の約数を求めるものですね。1の場合、素数が現れます。(赤色の部分)


LET RR=2 !赤の枚数 ※自然数n≧2
LET BB=1 !青の枚数 ※約数d=n-1
LET R=RR !赤の裏向きの枚数 step.1
LET B=BB !青の裏向きの枚数
DO
   LET M=MIN(R,B) !表にする枚数 step.2
   LET R=R-M !※dをひく
   LET B=B-M
   IF R=0 AND B=0 THEN !step.3C ※dで割り切れる
      PRINT RR;BB !step.4
      !!IF BB=1 THEN PRINT RR;BB !step.4
      LET RR=RR+1 !次へ
      LET BB=RR-1
      LET R=RR
      LET B=BB
   ELSEIF B=0 THEN !step.3A
      LET B=BB
   ELSEIF R=0 THEN !step.3B
      LET BB=BB-1 !※d=n-1,n-2,…,3,2,1
      LET R=RR
      LET B=BB
   END IF
LOOP
END


実行結果

2  1
3  1
4  2
5  1
6  3
7  1
8  4
9  3
10  5
11  1
12  6
13  1
14  7
15  5
16  8
17  1
18  9
19  1
20  10
21  7
22  11
23  1
24  12
25  5
26  13
27  9
28  14
29  1
30  15
31  1
32  16
33  11
34  17
35  7
36  18
37  1
38  19
39  13
40  20
41  1
42  21
43  1
44  22
45  15
46  23
47  1
48  24
49  7
50  25
 :
 :

 

戻る