高效的素数函数

时间:2013-10-26 15:27:28

标签: c performance primes

所以我正在尝试创建一个函数,该函数将返回1或0,具体取决于给定的数字是否为素数。

注意:我肯定知道给定的数字是自然的。大于1

我原来的功能:

int Prime(int a) {
    int i;
    for (i = 2; i*i <= a; i++)
    {
       if ((a % i) == 0)
          return 0;
    };
    return 1;
}

工作正常,但不知怎的......慢。我正在寻找一种更有效的算法而不使用数组。我的第二次尝试:

int Prime(int a) {
    int i;
    if (a == 2)
       return 1;
    if ((a % 2) == 0)
       return 0;

    for (i = 3; i*i <= a; i = i + 3)
    {
       if ((a % i) == 0) 
          return 0;
    };

    return 1;
}

结局很糟糕。有一些数字(我无法想象),小于MAX_INT,导致这个特定的算法工作得非常慢。所以,我有两个问题:

  1. 我的升级算法有问题吗?

  2. 有没有办法更有效地完成这项任务?

3 个答案:

答案 0 :(得分:1)

  

1)我的升级算法出了什么问题?

i=i+3需要为i=i+2,否则您需要检查3(3,6,9,12,...)的倍数而不是奇数(3,5,7,9) ,...)

  

2)有没有办法更有效地完成这项任务?

您可以计算sqrt(a)并将其分配给变量(例如sqrtOfA),并在循环条件中检查i <= sqrtOfA

或者您可以像prime number sieve一样尝试sieve of Eratosthenes

答案 1 :(得分:0)

这取决于你是想知道数字是素数还是只有高概率素数。 如果你对程序可能给出错误的答案感到满意,或者流星崩溃,那么流星崩溃的可能性更大,那么你就可以使用像Miller-Rabin测试这样的O(1)检查。

http://en.wikipedia.org/wiki/Miller%E2%80%93Rabin_primality_test

还有一个确定性的O(n ^ 12)算法用于素性测试,但在实践中并没有太多用。

答案 2 :(得分:0)

@Dukeling绝对正确。另外,我想添加一个小条件来检查&#34;是1个素数?&#34;

因为在标准程序中,我们在循环本身的帮助下得到1作为非素数。但在这里,我们必须为此手动添加条件。

所以只需添加以下内容&#39; if&#39;条件和你的代码完美运行!

$('.updatebutton').on('click', function(event) {
    var elements = $('.quantity input[name="quantity"]'),
        url = 'includes/cartoverzicht.php',
        postBody = [];
    for (var i=0; i<elements.length; i++) {
        var element = $(elements[i]);
        postBody.push({
            edit: element.attr('id'),
            aantal: element.val()
        })
    }
    var posting = $.post( url, JSON.stringify(postBody) );
    posting.done(function( data ) {
        var content = $( data );
        $( "#cartresult" ).empty().append( content );
    });
});