投稿者:たろさ
投稿日:2017年 4月13日(木)04時49分8秒
|
|
|
Ver. 1.0.2.0 fpc 3.0.2 にしてから、下記のプログラムの様な
大量テキスト出力
驚くほど高速です。
最初は、テキストwindow の下の方に表示される行数表示の不具合だと思ったのですが
別のエディターで見ても、行数表示とカウントした数値が合わない。
別のエディターで、原因ヶ所を見つけました。
25267 3724031 0
25268 3724067 0
25269 3724157 0
25270 3724211 0
25271 3724289 0
25272 3724541 0
23714 3464801 0
23715 3464969 0
23716 3465029 0
23717 3465101 0
23718 3465269 0
23719 3465281 0
--------------------
25272 3724541 までは合っています。
途中で増えてます。
440312 99999587 の計算結果も合っています。
8 440312 双子素数 10^8
9 3424506
10 27412679
プログラム
-----------------------------------------
LET t0=TIME
LET k=100000007
LET k2=5761456
DIM GT(k2)
CALL prime(k,k2,GT)
FOR i=1 TO k2-1
LET M=GT(i)
LET M1=GT(i+1)
IF M1-M=2 THEN
LET M2=MOD(M+1,6)
LET C=C+1
PRINT C;M;M2
END IF
NEXT i
LET TM=TIME-t0
PRINT USING"####." & REPEAT$("#",2):TM;
PRINT "秒"
END
EXTERNAL SUB prime(k,k2,GT())
!エラトステネスの篩
LET Fu=10007
LET Fm=1230
DIM P(Fu)
DIM A(Fm) !素数
MAT P=ZER
MAT A=ZER
LET A(1)=2
LET H1=1
FOR I=3 TO SQR(Fu) STEP 2
IF P(I)=0 THEN
FOR J=I*I TO Fu STEP I
LET P(J)=1
NEXT J
END IF
NEXT I
FOR I=3 TO Fu STEP 2
IF P(I)=0 THEN
LET H1=H1+1
LET A(H1)=I
END IF
NEXT I
LET Q=6
LET k7=k !篩の計算範囲
LET k5=IP(k7/Q)+1
DIM Au(k5),Av(k5)
MAT Au = ZER !(6*n-1)
MAT Av = ZER !(6*n+1)
FOR n=3 TO Fm
LET Pu=A(n)
IF MOD(Pu+1,Q)=0 THEN !(6*n-1)
LET ru=(Pu+1)/Q
FOR i=1 TO k5
IF Pu*i+ru>k5 THEN EXIT FOR
LET Au(Pu*i+ru)=1
NEXT i
END IF
IF MOD(Pu-1,Q)=0 THEN
LET ru=(Pu-1)/Q
FOR i=1 TO k5
IF Pu*i-ru>k5 THEN EXIT FOR
LET Au(Pu*i-ru)=1
NEXT i
END IF
IF MOD(Pu+1,Q)=0 THEN !(6*n+1)
LET ru=(Pu+1)/Q
FOR i=1 TO k5
IF Pu*i-ru>k5 THEN EXIT FOR
LET Av(Pu*i-ru)=1
NEXT i
END IF
IF MOD(Pu-1,Q)=0 THEN
LET ru=(Pu-1)/Q
FOR i=1 TO k5
IF Pu*i+ru>k5 THEN EXIT FOR
LET Av(Pu*i+ru)=1
NEXT i
END IF
NEXT n
LET GT(1)=2
LET GT(2)=3
LET cz=2
FOR n=1 TO k5
IF 6*n-1>k7 THEN GOTO 100
IF Au(n)=0 THEN
LET cz=cz+1
LET GT(cz)=6*n-1
END IF
100 IF 6*n+1>k7 THEN EXIT FOR
IF Av(n)=0 THEN
LET cz=cz+1
LET GT(cz)=6*n+1
END IF
NEXT n
END SUB
-----------------------------------------------
Ver. 0.9.8.1 と比較にならない処理速度です。
http://blogs.yahoo.co.jp/donald_stinger
|
|
|
投稿者:白石和夫
投稿日:2017年 4月13日(木)12時19分19秒
|
|
|
ご報告ありがとうございました。
私のところだと,
24373 3578129 0
24374 3578567 0
24375 3578681 0
24376 3579347 0
24377 3579647 0
22819 3313481 0
22820 3313571 0
22821 3313697 0
22822 3313901 0
22823 3314027 0
22824 3314237 0
22825 3314411 0
22826 3314501 0
22827 3314657 0
22828 3314951 0
となって,24377の次でおかしくなりました
2回目は
88951 16095179 0
88952 16095281 0
88953 16095347 0
87465 15778517 0
87466 15778571 0
87467 15779039 0
87468 15779189 0
87469 15779471 0
87470 15779549 0
87471 15779969 0
87472 15780419 0
となって異常となる位置は不確定なようです。
テキスト出力を一旦溜めてまとめて出力するようにしたのですが,
運が悪いと2度書き出されてしまうのかなと思います。
調べてみます。
|
|
|
投稿者:たろさ
投稿日:2017年 4月13日(木)19時37分3秒
|
|
|
> No.4300[元記事へ]
白石和夫さんへのお返事です。
> ご報告ありがとうございました。
お世話になります。
> 2回目は
> 88951 16095179 0
> となって異常となる位置は不確定なようです。
別programでテストしました。 結果
異常となる位置は不確定 ?
出力ファイル容量も不定
テスト プログラム
--------------------------------
LET t0=TIME
LET k=100000007
LET k2=5761456
DIM GT(k2)
CALL prime(k,k2,GT)
FOR i=1 TO k2-1
LET M=GT(i)
PRINT M
NEXT i
LET TM=TIME-t0
PRINT USING"####." & REPEAT$("#",2):TM;
PRINT "秒"
END
EXTERNAL SUB prime(k,k2,GT())
!エラトステネスの篩
LET Fu=10007
LET Fm=1230
DIM P(Fu)
DIM A(Fm) !素数
MAT P=ZER
MAT A=ZER
LET A(1)=2
LET H1=1
FOR I=3 TO SQR(Fu) STEP 2
IF P(I)=0 THEN
FOR J=I*I TO Fu STEP I
LET P(J)=1
NEXT J
END IF
NEXT I
FOR I=3 TO Fu STEP 2
IF P(I)=0 THEN
LET H1=H1+1
LET A(H1)=I
END IF
NEXT I
LET Q=6
LET k7=k !篩の計算範囲
LET k5=IP(k7/Q)+1
DIM Au(k5),Av(k5)
MAT Au = ZER !(6*n-1)
MAT Av = ZER !(6*n+1)
FOR n=3 TO Fm
LET Pu=A(n)
IF MOD(Pu+1,Q)=0 THEN !(6*n-1)
LET ru=(Pu+1)/Q
FOR i=1 TO k5
IF Pu*i+ru>k5 THEN EXIT FOR
LET Au(Pu*i+ru)=1
NEXT i
END IF
IF MOD(Pu-1,Q)=0 THEN
LET ru=(Pu-1)/Q
FOR i=1 TO k5
IF Pu*i-ru>k5 THEN EXIT FOR
LET Au(Pu*i-ru)=1
NEXT i
END IF
IF MOD(Pu+1,Q)=0 THEN !(6*n+1)
LET ru=(Pu+1)/Q
FOR i=1 TO k5
IF Pu*i-ru>k5 THEN EXIT FOR
LET Av(Pu*i-ru)=1
NEXT i
END IF
IF MOD(Pu-1,Q)=0 THEN
LET ru=(Pu-1)/Q
FOR i=1 TO k5
IF Pu*i+ru>k5 THEN EXIT FOR
LET Av(Pu*i+ru)=1
NEXT i
END IF
NEXT n
LET GT(1)=2
LET GT(2)=3
LET cz=2
FOR n=1 TO k5
IF 6*n-1>k7 THEN GOTO 100
IF Au(n)=0 THEN
LET cz=cz+1
LET GT(cz)=6*n-1
END IF
100 IF 6*n+1>k7 THEN EXIT FOR
IF Av(n)=0 THEN
LET cz=cz+1
LET GT(cz)=6*n+1
END IF
NEXT n
END SUB
--------------------------------
出力テキストファイル確認用 プログラム
--------------------------------
OPTION ARITHMETIC NATIVE
LET t0=TIME
LET k6=1000000
DIM A(k6),B(k6),C(k6)
OPEN #1:NAME "prime1E_84.TXT",ACCESS INPUT
OPEN #2:NAME "prime_1E8xv.TXT",ACCESS INPUT
FOR i=1 TO k6
INPUT #1: A(i)
INPUT #2: B(i)
NEXT i
CLOSE #1
CLOSE #2
PRINT A(10000);B(10000)
PRINT A(k6);B(k6)
MAT C=B-A
FOR n=1 TO k6
IF C(n)<>0 THEN PRINT n;A(n);B(n)
NEXT n
LET TM=TIME-t0
PRINT USING"####." & REPEAT$("#",2):TM;
PRINT "秒"
END
--------------------------------
計算結果
【1回目】
テキスト サイズ 69,707KB
104729 104729
13541903 15485863
17479 154159 193789
17480 154181 193793
17481 154183 193799
17482 154211 193811
17483 154213 193813
【2回目】
テキスト サイズ 70,410KB
104729 104729
13551851 15485863
17479 154159 193789
17480 154181 193793
17481 154183 193799
17482 154211 193811
17483 154213 193813
------------------------------
WRITE #1:M
問題ナシです。
http://blogs.yahoo.co.jp/donald_stinger
|
|
|
投稿者:白石和夫
投稿日:2017年 4月13日(木)20時43分50秒
|
|
|
原因は特定できた(修正したら問題なし)ので,
近いうちに修正版を出します。
お急ぎでしたら,
OUTPUT フォルダを一旦,空にして,
sourceフォルダのtextfile.pasの544行~552行にある
procedure TextoutExec
を以下のように書き換えてください。
var working:boolean=false; //追加
procedure TextoutExec;
begin
if working then exit; //追加
working:=true; //追加
if Cachelen>0 then
begin
TextForm.AppendString(CacheString);
CharPoint:=PChar(CacheString);
Cachelen:=0;
end;
working:=false; //追加
end;
|
|
|
投稿者:たろさ
投稿日:2017年 4月14日(金)05時34分0秒
|
|
|
> No.4303[元記事へ]
白石和夫さんへのお返事です。
> 原因は特定できた(修正したら問題なし)ので,
> 近いうちに修正版を出します。
>
> お急ぎでしたら,
> OUTPUT フォルダを一旦,空にして,
> sourceフォルダのtextfile.pasの544行~552行にある
> procedure TextoutExec
> を以下のように書き換えてください。
>
> var working:boolean=false; //追加
> procedure TextoutExec;
> begin
> if working then exit; //追加
> working:=true; //追加
> if Cachelen>0 then
> begin
> TextForm.AppendString(CacheString);
> CharPoint:=PChar(CacheString);
> Cachelen:=0;
> end;
> working:=false; //追加
> end;
試ました。
Free Pascal Compiler version 3.0.2 [2017/02/27] for i386
Copyright (c) 1993-2017 by Florian Klaempfl and others
textfile.pas(548,18) Fatal: illegal character "'?'" ($E3)
Fatal: Compilation aborted
わかりません。
急いでおりませんので、お暇な時にでも、教えてください。
http://blogs.yahoo.co.jp/donald_stinger
|
|
|
投稿者:白石和夫
投稿日:2017年 4月14日(金)08時17分47秒
|
|
|
> No.4305[元記事へ]
多分,//追加 を直前の; の次の空白から消せば動くと思いますが,
にtextfile.pasをアップロードしておきます。
上書きしてください。
たろささんへのお返事です。
> 白石和夫さんへのお返事です。
>
> > 原因は特定できた(修正したら問題なし)ので,
> > 近いうちに修正版を出します。
> >
> > お急ぎでしたら,
> > OUTPUT フォルダを一旦,空にして,
> > sourceフォルダのtextfile.pasの544行~552行にある
> > procedure TextoutExec
> > を以下のように書き換えてください。
> >
> > var working:boolean=false; //追加
> > procedure TextoutExec;
> > begin
> > if working then exit; //追加
> > working:=true; //追加
> > if Cachelen>0 then
> > begin
> > TextForm.AppendString(CacheString);
> > CharPoint:=PChar(CacheString);
> > Cachelen:=0;
> > end;
> > working:=false; //追加
> > end;
>
> 試ました。
>
> Free Pascal Compiler version 3.0.2 [2017/02/27] for i386
> Copyright (c) 1993-2017 by Florian Klaempfl and others
> textfile.pas(548,18) Fatal: illegal character "'?'" ($E3)
> Fatal: Compilation aborted
>
> わかりません。
>
> 急いでおりませんので、お暇な時にでも、教えてください。
>
>
>
|
|
|
投稿者:たろさ
投稿日:2017年 4月14日(金)09時03分25秒
|
|
|
戻る