KnowledgeHub
Questions
Tags
Users
Search
Alex Rivera
|
Logout
Edit Question
Title
Body
I've been working to optimize the Lucas-Lehmer primality test using C# code (yes I'm doing something with Mersenne primes to calculate perfect numbers. I was wondering it is possible with the current code to make further improvements in speed. I use the System.Numerics.BigInteger class to hold the numbers, perhaps it is not the wisest, we'll see it then. This code is actually based on the intelligence found on: http://en.wikipedia.org/wiki/Lucas%E2%80%93Lehmer_primality_test This page (at the timestamp) section, some proof is given to optimize the division away. The code for the LucasTest is: public bool LucasLehmerTest(int num) { if (num % 2 == 0) return num == 2; else { BigInteger ss = new BigInteger(4); for (int i = 3; i <= num; i++) { ss = KaratsubaSquare(ss) - 2; ss = LucasLehmerMod(ss, num); } return ss == BigInteger.Zero; } } Edit: Which is faster than using ModPow from the BigInteger class as suggested by Mare Infinitus below. That implementation is: public bool LucasLehmerTest(int num) { if (num % 2 == 0) return num == 2; else { BigInteger m = (BigInteger.One << num) - 1; BigInteger ss = new BigInteger(4); for (int i = 3; i <= num; i++) ss = (BigInteger.ModPow(ss, 2, m) - 2) % m; return ss == BigInteger.Zero; } } The LucasLehmerMod method is implemented as follows: public BigInteger LucasLehmerMod(BigInteger divident, int divisor) { BigInteger mask = (BigInteger.One << divisor) - 1; //Mask BigInteger remainder = BigInteger.Zero; BigInteger temporaryResult = divident; do { remainder = temporaryResult & mask; temporaryResult >>= divisor; temporaryResul
Tags (comma-separated)
Save Edits
Cancel