Lehmann Primiality Test in R
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
After a small frustration with the limitations of R 16-bit intergers. I think i have worked out a solution. The issue was i was implementing a bone-headed solution to the modulo/exponent step. So to recap. The Lehmann primality test is a probabilistic prime test. I got the implementation from this article http://davidkendal.net/articles/2011/12/lehmann-primality-test
the basic logic is to take n
1. get a random number a = between 1 and n-1
2. calculate x =(a^(n-1)/2) %% n
3. if x == 0 or x == (-1 %% n) then the number could be prime
The issue happened when calculating x =(a^(n-1)/2) %% n. For even n < 100 the number in this function gets big. So big that the limitation on R integer lengths rounds the number and then the modulo function is meaningless. The way to fix this is to use modular exponentiation. (Thanks to stackoverflow for bringing up the solution). This allows us to iteratively multiply the base by the exponent and store the modulo for every step. By doing this we never have to deal with a number so large as to screw with the R limitations.There are some clever highly efficient modular exponentiation algorithms but i am no computer scientist so we will use the simplest(modular exponentiation with modular multiplication)
Here is the full solution:
modexp<-function(a, b, n){ r = 1 for (i in 1:b){ r = (r*a) %% n } return(r) } primeTest <- function(n, iter){ a <- sample(1:(n-1), 1) lehmannTest <- function(y, tries){ x <- modexp(y, (n-1)/2, n) if (tries == 0) { return(TRUE) }else{ if ((x == 1) | (x == (-1 %% n))){ lehmannTest(sample(1:(n-1), 1), (tries-1)) }else{ return(FALSE) } } } if( n
This type of iterative exponentiation is implemented in Python under pow() so a python implementation is quite easy to build as well. Enjoy. R can get frustrating but a little searching around can get you a far way.
Cheers
J
R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.