2

n現在、数値が素数かどうかをチェックするプログラムを MATLAB で作成しようとしています。手始めに、 Fermat Primality Testを実装しています。

フェルマーは、素数pとについて次のように述べてい1 <= b < pます。

b^(p-1) = 1  (mod p)

したがって、MATLAB ではp = 17、およびb = 11

>> mod(b^(p-1),p)

また

>> rem(b^(p-1),p)

私が抱えている問題は、このインスタンスに対して MATLAB が を返すこと0です。ただし、p素数の場合は を返す必要があり1ます。何が欠けているのかわからないので、どんな助けも大歓迎です!

4

3 に答える 3

2

2^53個々の整数は、doubleまでの「連続的に」しか表現できません。11^16はこれよりも大きいため、近似値が使用されます。この計算を実行するには、任意精度の整数データ構造を使用する必要があります。これを行うアドオンの 1 つを次に示します。

于 2014-01-21T00:48:44.080 に答える
1

これは、フロートの丸めによるものだと思います。これは のヘルプ セクションmodです。

EDU>> help mod

MOD    Modulus after division.
MOD(x,y) is x - n.*y where n = floor(x./y) if y ~= 0.  If y is not an
integer and the quotient x./y is within roundoff error of an integer,
then n is that integer.  The inputs x and y must be real arrays of the
same size, or real scalars.

The statement "x and y are congruent mod m" means mod(x,m) == mod(y,m).

By convention:
   MOD(x,0) is x.
   MOD(x,x) is 0.
   MOD(x,y), for x~=y and y~=0, has the same sign as y.

Note: REM(x,y), for x~=y and y~=0, has the same sign as x.
MOD(x,y) and REM(x,y) are equal if x and y have the same sign, but
differ by y if x and y have different signs.

See also rem.

Overloaded methods:
   sym/mod

Reference page in Help browser
   doc mod

これは、MATLAB で mod を実装するのは奇妙に思えfloor(x./y)ますが、それが理由であると確信しています。

編集:これが役立つと思います。

于 2014-01-21T00:49:07.623 に答える