Rabin-Miller-Prime 测试

安东钳

它运行完美,但当数字为 6 位或更多时,它会“崩溃”。我不知道为什么它不起作用。我也没有尝试很多方法来修复它,因为我没有从哪里开始。我知道,测试有一些弱点,我已经做了一些研究。有一些数字不能被测试检测到,但是当你提高准确性时应该将它们过滤掉

bool testPrime(int primenumber_1)
{
    bool even_number_checker = false;
    bool prime;
    int counter = 0;
    int primenumber_mod = 0;
    int variable_1 = 1;
    int variable_2 = 1;
    primenumber_mod = primenumber_1 - 1;
    if(primenumber_1 % 2 == 0) return false;
    while(primenumber_mod%2 == 0)
    {
        primenumber_mod/=2;
    }
    if(even_number_checker == false && primenumber_1        != 43405 && primenumber_1 != 27905)
    {
        variable_1 = (int)pow(2, primenumber_mod) % primenumber_1;
        if(variable_1 != 1 && variable_1 != -1)
        {
            while(variable_1 + 1 != primenumber_1 &&
                  variable_1 - 1 != primenumber_1 &&
                  variable_2 + 1 != primenumber_1 &&
                  variable_2 -1 != primenumber_1)
            {                
                if(counter >= 40) break;
                variable_2 = (int)pow(variable_1, 2) % primenumber_1;
                variable_1 = variable_2;
                counter++;
            }
            prime = (variable_1 + 1 == primenumber_1 ||
                     variable_2 + 1 == primenumber_1);
        }
    }
    return prime;
}

int primeGenerator()
{
    int number = rand()%999900+100000;
    while(!testPrime(number))
    {
        number = rand()%899000+100000;
    }
    return number;
}

bool testPrimeSafe(int number)
{
    for(int i = 2; i < number; i++)
    {
        if(number % i == 0)
        {
            return false;
        }
    }
    return true;
}

void testTestPrime()
{
    for(int i = 0; i < 10000; i++)
    {
        int prime = primeGenerator();
        if(testPrimeSafe(prime))
        {
            std::cout << "\e[32;42mSUCCESS :: " << prime << "\e[0m\n";
        }
        else
        {
            std::cout << "\e[48;5;196;1m*EVIL MORTY THEME PLAYING* :: " << prime << "\e[0m\n";
        }
    }
}

int main()
{
    srand(time(NULL));
    testTestPrime();
}
约雷克

如果大于 31,那么(int)pow(2, primenumber_mod)将溢出一个有符号的 32 位整数。如果输入是一个 6 位整数,它很可能会比这大得多。primenumber_modprimenumber_mod

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章