BASIC Acc Ver. 1.0.2.0 不具合の報告です。

 投稿者:たろさ  投稿日: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

 

Re: BASIC Acc Ver. 1.0.2.0 不具合の報告です。

 投稿者:白石和夫  投稿日: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度書き出されてしまうのかなと思います。
調べてみます。

 

Re: BASIC Acc Ver. 1.0.2.0 不具合の報告です。

 投稿者:たろさ  投稿日: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

 

Re: BASIC Acc Ver. 1.0.2.0 不具合の報告です。

 投稿者:白石和夫  投稿日: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;                                  
 

Re: BASIC Acc Ver. 1.0.2.0 不具合の報告です。

 投稿者:たろさ  投稿日: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

 

Re: BASIC Acc Ver. 1.0.2.0 不具合の報告です。

 投稿者:白石和夫  投稿日: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
>
> わかりません。
>
> 急いでおりませんので、お暇な時にでも、教えてください。
>
>
>
 

Re: BASIC Acc Ver. 1.0.2.0 不具合の報告です。

 投稿者:たろさ  投稿日:2017年 4月14日(金)09時03分25秒
  > No.4306[元記事へ]

白石和夫さんへのお返事です。

> 多分,//追加 を直前の; の次の空白から消せば動くと思いますが,
>
> にtextfile.pasをアップロードしておきます。
> 上書きしてください。
>
上書き出来ました。計算結果も合ってます。有難うございました。

http://blogs.yahoo.co.jp/donald_stinger

 

戻る