Fast Prime Factorization Algorithm

前端 未结 2 720
抹茶落季
抹茶落季 2021-02-09 02:05

I\'m writing a code in C that returns the number of times a positive integer can be expressed as sums of perfect squares of two positive integers.

R(n) is the nu         


        
2条回答
  •  滥情空心
    2021-02-09 02:21

    There's a fast way to cut down the number of candidates. This routine tries 2, then 3, then all the odd numbers not divisible by 3.

    long mediumFactor(n)
    {
        if ((n % 2) == 0) return 2;
        if ((n % 3) == 0) return 3;
        try = 5;
        inc = 2;
        lim = sqrt(n);
        while (try <= lim)
        {
           if ((n % try) == 0) return try;
           try += inc;
           inc = 6 - inc;  // flip from 2 -> 4 -> 2
        }
        return 1;  // n is prime
    }
    

    The alternation of inc between 2 and 4 is carefully aligned so that it skips all even numbers and numbers divisible by 3. For this case: 5 (+2) 7 (+4) 11 (+2) 13 (+4) 17

    Trials stop at sqrt(n) because at least one factor must be at or below the square root. (If both factors were > sqrt(n) then the product of the factors would be greater than n.)

    Number of tries is sqrt(m)/3, where m is the highest possible number in your series. For a limit of 2147483647, that yields a maximum of 15,448 divisions worst case (for a prime near 2147483647) including the 2 and 3 tests.

    If the number is composite, total number of divisions is usually much less and will very rarely be more; even taking into account calling the routine repeatedly to get all the factors.

提交回复
热议问题