Малая теорема Ферма в JS

Я просто попытался реализовать маленькую теорему Ферма в JavaScript. Я попробовал оба способа: a^(p-1) mod p = 1 и A^P mod p = a mod p.

function fermat(a, p) {
  return (((a ^ (p - 1)) % p) === 1);
}

и

function fermat(a, p) {
  return ( ( a^p ) % p ) === ( a % p );
}

это не работает в обоих направлениях, есть ли способ исправить это?

5 ответов


В Javascript ^ означает XOR. Для возведение в степень вам нужно Math.pow(x, y).

function fermat(a, p) {
  return Math.pow(a, p - 1) % p === 1;
}

вместо ^ Вам нужно использовать математику.Пау!--1-->


В дополнение к ^ и математике.PoW () вопрос другие указали, следующее препятствие вероятно, вы столкнетесь с ограниченной точностью встроенного числового кода Javascript типы. Вы очень быстро превысите диапазон точно представляемого Javascript числа, как только показатели начнут становиться большими, как они будут, если вы хотите использовать такую процедуру как тест на примитивность. Вы можете посмотреть в библиотека Javascript bignum (например,этот), что поддерживает возведение в степень и модуль для сколь угодно больших целых чисел.


в javascript Карат ( ^ ) является оператором XOR. Вы хотите использовать математику.функция pow(x,y), эквивалентная функции x^y.


вот мой код (JavaScript)для проверки того, является ли число простым на основе теоремы Ферма.

    function getRandomInt(min,max) { /* getting a random between given max and min values */
        min = Math.ceil(min);
        max = Math.ceil(max);
        return Math.floor(Math.random()*(max-min))+min;
    }

    function getGCD(a,b) { /* getting the greatest common divisor */
        var tmp;
        while (b !== 0) {
            tmp = b;
            b = a%b;
            a = tmp;
        }
        return a;
    }

    function getPower(a,b,p) { /* getting the a^b mod p */
        if (b == 1)
         return a%p;
        else {
         x = getPower(a,Math.floor(b/2),p);
         if (b%2 == 0) 
          return (x*x)%p;
         else return (((x*x)%p)*a)%p;
        }
    }

    function fermatTesting(Num) { //Checking Num by using Fermat's theorem
        var a = getRandomInt(2,Num-1);
        if (getGCD(a,Num) !== 1) {
            return "COMPOSITE";
        }
        else {
            if (getPower(a,Num-1,Num) !== 1) {
                return "COMPOSITE";
            }
            else {
                return "PRIME"; 
            }
        }
    }

    console.log(fermatTesting(57)); //Displays "COMPOSITE"