Lehmann algorithm doesn't make sense

c++, number-theory, rsa

Solution

By calculating `f`, you've done step 1, but you're leaving out steps 2 and 3.

p = 7; //definitely a prime number

double e = (p - 1 )/2;

int f = (int)pow(3, e) % p;

// Step 2
if(f % p != 1 && f % p != p - 1)
    cout << p << " is definitely not prime." << endl;
else // If not step 2, then step 3
    cout << p << " has 50% probability of being prime." << endl;

The operator `%` is the mod operator. It reduces the left number mod the right number. Like `10 % 8` is `2`. It's important to note that, when the left number is positive the result is always positive. So if `a = b - 1`, `a % b` is `a`, which is to say that, if `a = -1 mod b`, then `a % b == a`.

The condition `f % p != 1 && f % p != p - 1` in English is `(f % p not equal 1) AND (f % p not equal p - 1)`

One problem is that this will overflow for big `p`.

If you want to avoid using a bignum library, you can define your own pow like so:

unsigned int my_pow(unsigned int base, unsigned int expon, unsigned int mod){
    unsigned int result = base;
    for(int i = 1;i < expon;i++)
        result = (result * base) % mod;
    return result
}

You would use this like `int f = pow(3, e, p);`. I'm not sure how to bound when this will overflow, but it will be a lot larger than the normal `pow`.

Problem

I tried implementing the Lehmann test but it doesn't work the first time round. I followed what everyone described - Calculate r = [ a^( (p -1) / 2) ] mod p - If r is not 1 or –1 then p is definitely not a prime. - If r = 1 or –1 the likelihood that p is not prime is at most than 50 percent. No matter how I did it, it never works. I even tried hard coding it ``` p = 7; //definitely a prime number double e = (p - 1 )/2; int f = (int)pow(3, e) % p; cout << f <<endl; ``` and f ended up as 6 any help will be appreciated

Original source