Когда-то я баловался с этим делом, примерно такие результаты получил:
## Код:
```
100000        1000000
Haskell          1.82 sec       47.7 sec
C GCC 3.4.5      0.44 sec       11.3 sec
ComponentPascal  0.65 sec       17.0 sec
```
## Код:
```
primes'wheel :: [Int]
primes'wheel = 2:3:5:7:filter isPrime'wheel (spin wheel2357 11)
  where
    isPrime'wheel :: Int -> Bool
    isPrime'wheel !x = all (\p -> x `mod` p /= 0) $ takeWhile (\p -> p*p <= x) $ tail primes'wheel

    wheel2357 :: [Int]
    wheel2357 = 2:4:2:4:6:2:6:4:2:4:6:6:2:6:4:2:6:4:6:8:4:2:4:2:
                4:8:6:4:6:2:4:6:2:6:6:4:2:4:6:2:6:4:2:4:2:10:2:10:wheel2357

    spin :: [Int] -> Int -> [Int]
    spin (x:xs) n = n:spin xs (n + x)
```
## Код:
```
#define maxn 1000000

int ps[maxn];

int primes_c (int n)
{
    int  i = 2, j, p = 5, f;
    ps[0] = 2; ps[1] = 3;
    while (i < n)
    {
        f = 1; j = 1;
        while (f && (ps[j]*ps[j] <= p))
        {
            f = (p % ps[j]);
            j++;
        }
        if (f)
        {
            ps[i] = p;
            i++;
        }
        p += 2;
    }
    return ps[i-1];
}
```
## Код:
```
MODULE Primes;
IMPORT SL:=StdLog;

CONST nmax = 1000000;
VAR ps : ARRAY nmax OF INTEGER;

PROCEDURE Prime(n : INTEGER) : INTEGER;
VAR i, j, p : INTEGER;
    f : BOOLEAN;
BEGIN
  ps[0] := 2; ps[1] := 3;
  i := 2; p := 5;
  WHILE i < n DO
    f := TRUE;
    j := 1;
    WHILE f & (ps[j]*ps[j] <= p) DO
      f := (p MOD ps[j]) # 0;
      INC(j)
    END;
    IF f THEN
      ps[i] := p;
      INC(i)
    END;
    INC(p,2)
  END;
  RETURN ps[n-1]
END Prime;

PROCEDURE Do*;
BEGIN
  SL.Int(Prime(1000000)); SL.Ln;
END Do;

END Primes.
```
