素数の個数

 投稿者:永野護  投稿日:2010年 9月27日(月)12時41分4秒
  先日図書館で借りてきた本(和算の事典  佐藤健一監修  朝倉書店)
に素数の個数を求める式として以下のようなものが出ていました。
------------------------------------------------------------------
一般には2より素数Nまで素数が何個あるかは次のようにして求める。
2=p1,p2,p3,..........pr<√N(ルートN)
素数の個数=N-Σ[N/p1]+Σ[N/p1p2]-Σ[N/p1p2p3]+..........+{(-1)^(n-1)}r-1
ただし記号[]は分数の整数部分を表す。
-----------------------------------------------------
質問ですが上述の式で求まる素数の個数は正確な値でしょうか。
それとも概数でしょうか。N=100あるいはN=200の例で説明していただけないでしょうか。
またBASICで上述の式を使って素数の個数を求めるプログラムを作るとどのようになるのでしょうか。ご多忙の折まことに恐縮ですが、回答を示していただけると助かります。
よろしくお願いいたします。
 

Re: 素数の個数

 投稿者:山中和義  投稿日:2010年 9月27日(月)16時57分12秒
  > No.1399[元記事へ]

永野護さんへのお返事です。

> 一般には2より素数Nまで素数が何個あるかは次のようにして求める。
> 2=p1,p2,p3,..........pr<√N(ルートN)
> 素数の個数=N-Σ[N/p1]+Σ[N/p1p2]-Σ[N/p1p2p3]+..........+{(-1)^(n-1)}r-1
> ただし記号[]は分数の整数部分を表す。

記載された文章と式はこのようになっているのですか?(原本がありませんので)


解釈を強引にして、(p1,p2などは素数を意味しているとか、、、)

Nなでの素数を求める場合、√Nまでの素数で割っていきます。

N=29の場合
2=P1≦P2=3≦P3=5<√29、Prの個数r=3となる。

1から29の範囲で、2で割れるものの数は、[29/2]
1から29の範囲で、3で割れるものの数は、[29/3]
1から29の範囲で、5で割れるものの数は、[29/5]

1から29の範囲で、2と3で割れるものの数は、[29/(2*3)]
1から29の範囲で、3と5で割れるものの数は、[29/(3*5)]
1から29の範囲で、5と2で割れるものの数は、[29/(5*2)]

1から29の範囲で、2と3と5で割れるものの数は、[29/(2*3*5)]

以上より、1から29の範囲で、2でも3でも5でも割り切れないものの数は
包除原理より
 N-Σ{1≦i≦r}[N/Pi]+Σ{1≦i<j≦r}[N/(Pi*Pj)]-Σ{1≦i<j<k≦r}[N/(Pi*Pj*Pk)]

最後に2、3、5は含まれて、1は含まないので、r-1=2-1 と補正する。

これのプログラムは、
LET N=29
PRINT N -(INT(N/2)+INT(N/3)+INT(N/5)) +(INT(N/(2*3))+INT(N/(3*5))+INT(N/(5*2))) -INT(N/(2*3*5)) +3-1
END
となります。一般化は素数列と組合せ生成でできます。


ただ、最後の(-1)^(n-1)*r-1 の部分が異なりますが、、、
 

素数の個数

 投稿者:永野護  投稿日:2010年 9月27日(月)17時14分26秒
  山中様、回答ありがとうございました。
P1,P2,P3などは素数です。
この場合のΣの意味か分かりませんでした。
 

Re: 素数の個数

 投稿者:山中和義  投稿日:2010年 9月28日(火)09時18分47秒
  > No.1401[元記事へ]

一般化してみました。
√Nとして、101までの素数を準備しているので、
1から10000までの範囲で素数の個数を求めることができます。

この計算式では、Nが大きくなると組合せの数が大きくなり、実用的ではありません。
PUBLIC NUMERIC N
LET N=1000

!100までの素数
DATA 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,101
PUBLIC NUMERIC P(26)
MAT READ P

PUBLIC NUMERIC W
LET W=0

LET R=0 !√Nまでの素数の個数
DO WHILE P(R+1)^2<=N
   LET R=R+1
LOOP
PRINT "R=";R !debug

DIM A(R)
FOR d=1 TO R !(-1)^d*Σ{1≦i<j<k< … ≦r}[N/(Pi*Pj*Pk* … )]
   CALL IntegerSolution(R,d,1, A)
NEXT d

PRINT "範囲[ 1,";N;"]で素数は"; N +W +R-1; "個"

END


EXTERNAL SUB IntegerSolution(m,d,s, A()) !1≦A1<A2<A3<…<Ad≦mを満たす整数解
IF s>1 THEN LET t=A(s-1)+1 ELSE LET t=1
FOR i=t TO m
   LET A(s)=i

   IF d=1 THEN !ひとつの組が求まったら

      LET t=P(A(1)) !除数を求める
      FOR k=2 TO s
         LET t=t*P(A(k))
         IF t>N THEN EXIT FOR !Nより大きいなら、INT(N/t)は0となる
      NEXT k
      IF t<=N THEN LET W=W+INT(N/t)*(-1)^s

   ELSE
      CALL IntegerSolution(m,d-1,s+1, A) !次へ
   END IF
NEXT i
END SUB
 

素数の個数

 投稿者:永野護  投稿日:2010年 9月28日(火)10時11分32秒
  山中様、いつもお世話になっています。貴重なプログラムありがとうございました。
たいへん助かりました。それとN0.992に
----------------------------------------------------
   > No.992[元記事へ]

問題
 2辺が47と65の長方形がある。
 これに10個の正方形を敷き詰めるには、どうすればよいか。

攻略法 「ユークリッドの互除法」

最大公約数を求める過程が「正方形で分割していく」に相当する。

!長方形を正方形で分割する
!例
! ┌──┬┬┐
! │  ├┴┤
! │  │ │
! └──┴─┘

LET a=65
LET b=47

IF a< b THEN !a≧bとする
   LET t=a !swap it
   LET a=b
   LET b=t
END IF

DO UNTIL b=0 !ユークリッドの互除法、連分数展開
   LET q=INT(a/b) !商
   PRINT "一辺";b;"の正方形が";q;"個"
   LET r=a-q*b !余り ※長方形をすべて正方形に分割できれば0となる
   LET a=b
   LET b=r
LOOP

PRINT "最大公約数=";a

END

実行結果
一辺 47 の正方形が 1 個
一辺 18 の正方形が 2 個
一辺 11 の正方形が 1 個
一辺 7 の正方形が 1 個
一辺 4 の正方形が 1 個
一辺 3 の正方形が 1 個
一辺 1 の正方形が 3 個
最大公約数= 1
-----------------------------------------------------------
とありますがこのプログラムで求まる答えは使用する正方形の最小個数でしょうか。
たびたびお手数をおかけして申し訳ございません。回答していただければ幸いです。
なにとぞ宜しくお願いします。
 

Re: 素数の個数

 投稿者:山中和義  投稿日:2010年 9月28日(火)10時47分28秒
  > No.1404[元記事へ]

永野護さんへのお返事です。

> このプログラムで求まる答えは使用する正方形の最小個数でしょうか。

「長方形の正方分割」については、1925年モロンによって
 33×32の長方形を9枚のすべて異なる大きさの正方形(1,4,7,8,9,10,14,15,18)
 65×47の長方形を10枚のすべて異なる大きさの正方形(3,5,6,11,17,19,22,23,24,25)
で敷き詰めました。

このプログラムで求めると、
33×32の長方形
 一辺 32 の正方形が 1 個
 一辺 1 の正方形が 32 個

65×47の長方形
 一辺 47 の正方形が 1 個
 一辺 18 の正方形が 2 個
 一辺 11 の正方形が 1 個
 一辺 7 の正方形が 1 個
 一辺 4 の正方形が 1 個
 一辺 3 の正方形が 1 個
 一辺 1 の正方形が 3 個

となるので、枚数は最少となる場合があります。一般的には、最少ではありません。
 

素数の個数

 投稿者:永野護  投稿日:2010年 9月28日(火)12時46分16秒
  山中様、貴重なご助言ありがとうございました。
お手数をおかけしました。
 

戻る