[Haskell-beginners] Prime number test performance on negative integers

Folsk Pratima folsk0pratima at cock.li
Mon Dec 11 19:41:00 UTC 2023


>Il 11 dicembre 2023 alle 20:24 Folsk Pratima ha scritto:
>> Also, the fact that the code runs forever nonetheless is very sad,
>> because C equivalent taken from wiki[1] calculates the whole things
>> almost immediately. The C code is ultra simplified:
>> 
>> #include <stdio.h>
>> #include <stdint.h>
>> int IsPrime(int64_t n)
>> {
>>     if (n == 2 || n == 3)
>>         return 1;
>> 
>>     if (n <= 1 || n % 2 == 0 || n % 3 == 0)
>>         return 0;
>> 
>>     for (int i = 5; i * i <= n; i += 6)
>>     {
>>         if (n % i == 0 || n % (i + 2) == 0)
>>             return 0;
>>     }
>> 
>>     return 1;
>> }
>> 
>> int main () {
>>     printf ("1506491439391566589: %d\n", IsPrime
>> (1506491439391566589)); }
>
>Let’s implement the algorithm in Haskell, shall we?
>
>    import System.Environment
>
>    isPrimeWiki :: Integer -> Bool
>    isPrimeWiki 2 = True
>    isPrimeWiki 3 = True
>    isPrimeWiki n
>        | n <= 1 ||
>          rem n 2 == 0 ||
>          rem n 3 == 0    = False
>    isPrimeWiki n =
>        let f i
>              | i^2 > n = True
>              | rem n i == 0 ||
>                rem n (i+2) == 0 = False
>              | otherwise = True
>        in f 5
>
>    main :: IO ()
>    main = do
>        [n] <- getArgs
>        print $ isPrimeWiki (read n)
>
>then
>
>    f at x270:/tmp/prova$ time ./prime 1506491439391566589
>    True
>
>    real    0m0.014s
>    user    0m0.001s
>    sys     0m0.005s
Ahem,

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
int IsPrime(int64_t n, char **msg)
{
    if (n == 2 || n == 3)
        return 1;

    if (n <= 1 || n % 2 == 0 || n % 3 == 0)
        return 0;

    for (int i = 5; i * i <= n; i += 6)
    {
        if (n % i == 0) {
            sprintf (*msg, "divisible by %d", i);
            return 0;
        }
        if (n % (i + 2) == 0) {
            sprintf (*msg, "divisible by %d", i + 2);
            return 0;
        }
    }

    return 1;
}

int main () {
    char *msg[1];
    msg[0] = malloc (sizeof (char) * 128);
    sprintf (msg[0], "success");
    int res;
    int64_t num;
    char numstr[] = "1506491439391566589";
    num = 1506491439391566589;
    res = IsPrime (num, msg);
    printf ("%s: %d: %s\n", numstr, res, msg[0]);
}

tells me the number is divisible by 13 and is *not* primal. The
qalculate tells me pretty much the same!


More information about the Beginners mailing list