2

Forthで素数性を確認するにはどうすればよいですか?

これが私が今使っているものですが、数字が大きくなると遅くなります:

: prime ( n - f )
  DUP 2 < IF 
    DROP 0 EXIT
  THEN
  DUP 2 ?DO
    DUP I I * < IF
      DROP -1 LEAVE
    THEN
    DUP I MOD 0= IF
      DROP 0 LEAVE
    THEN
  LOOP ;
4

1 に答える 1

5

簡単な確率的手法は、ウィキペディアで調べることができるフェルマー検定を使用することです。

: *mod ( a b n -- n2 )
    */mod drop ;

: expmod { x e n -- n2 } \ compute x^e mod n by repeated squaring
    e 0= if 1 exit
    else
        x e 2/ n recurse dup n *mod
        e 1 and if x n *mod then 
    then ;

: prime ( n -- f )
    3 swap dup expmod 3 = ;

このテストで数値が合成数であると示された場合、それは間違いなく合成数です。数が素数であると表示されている場合、それは確率的素数ですが、いくつかの合成数がすり抜けます(このような数は「擬素数」と呼ばれます)。テストは非常に高速で、いくつかの目的には十分です。

投稿したコードは、nの平方根まで除数2,3,4,5、...をテストします。必要がないため、2,3,5,7...をテストした場合の約2倍の速度になります。 2より大きい約数でもテストします。

于 2012-11-22T04:40:40.020 に答える