Bruce Leenstra wrote:
>
> As luck would have it, this is nearly what I am doing right now:
>
> tempvalue = (q+1)/2
> count = 1
> while tempvalue != 1 {
> if tempvalue is odd tempvalue += q
> shiftright tempvalue
> count++
> }
> v = count
I'm not sure I understand that code yet, but
> I've crunched through all q < 2^23; [...] The program is really starting to slow
>down.
There may be a faster method.
Let f be a prime factor of the prime exponent Mersenne number M(p).
f | M(p) <=>
2^p == 1 (mod f) <=>
ord(2) (mod f) | p <=> (since ord(n) = 1 <=> n = 1)
ord(2) (mod f) = p.
Thus, f is a factor of M(p) if and only if the group order of 2 (mod f)
is equal to p.
On the other hand, ord(2) (mod f) divides f-1, since f is prime.
We can thus test whether f is a factor of some prime exponent Mersenne
M(p) by testing all prime divisors p of f-1 and checking if 2^p == 1
(mod f).
I add a quick hack to exemplify. Please don't take this code too
seriously. I made no effort to make it efficient, for example all odd
and not only prime f are tested and the trial division is pathetic, too.
An order of magnitude speedup would be possible.
But the basic algorithm is reasonably fast:
time ./ismersfac >/dev/null
real 1m7.907s
user 1m7.710s
sys
0m0.040s
for f < 10000000 =~ 2^23.25 , on a K6-II 500Mhz.
#include <stdio.h>
unsigned int powmod(unsigned int a, unsigned int b, unsigned int m) {
unsigned int t = 0, mask = 1<<31;
if (b == 0) return 1;
while ((b & mask) == 0) mask >>= 1;
mask >>= 1;
t=a;
while (mask) {
t = (unsigned long long) t * t % m;
if (b & mask) {
t = (unsigned long long) t * a % m;
}
mask >>= 1;
}
return t;
}
unsigned int ismersfac(unsigned int f) {
unsigned int fm1 = f-1;
unsigned p;
while ((fm1 & 1) == 0) fm1 >>= 1;
for (p = 3; p*p <= fm1; p+=2) {
if (fm1 % p == 0) {
if (powmod(2, p, f) == 1) {
return p;
} else {
while (fm1 % p == 0)
fm1 /= p;
}
}
}
if (fm1 > 1) {
if (powmod(2, fm1, f) == 1)
return fm1;
}
return 0;
}
int main() {
unsigned int i, p;
for (i=3; i < 10000000; i+=2) {
if ((p = ismersfac(i)))
printf("M( %d )C: %d\n", p, i);
}
return 0;
}
_________________________________________________________________________
Unsubscribe & list info -- http://www.ndatech.com/mersenne/signup.htm
Mersenne Prime FAQ -- http://www.tasam.com/~lrwiman/FAQ-mers