Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 3407557

Browse files
committed
add miller rabin deterministic algorithm for prime test
1 parent c86d23c commit 3407557

File tree

1 file changed

+56
-0
lines changed

1 file changed

+56
-0
lines changed

‎Algorithms/MillerRabin.java

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
/**
2+
* Author : joney_000 [developer.jaswant@gmail.com]
3+
* Algorithm : Miller Rabin
4+
* Platform : Codejam
5+
* Ref : https://en.wikipedia.org/wiki/Miller%E2%80%93Rabin_primality_test#Testing_against_small_sets_of_bases
6+
*/
7+
8+
class MillerRabin {
9+
10+
/* @input: `number` for which we need to check weather it is prime or not
11+
* @description: this is the deterministic varient of the miller ribbin
12+
*/
13+
boolean isPrime(long number){
14+
if(number < 2){
15+
return false;
16+
}
17+
int smallPrimes[] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29};
18+
for(int prime : smallPrimes){
19+
if(number % prime == 0){
20+
return number == prime;
21+
}
22+
}
23+
int trailingZeros = Long.numberOfTrailingZeros(number - 1);
24+
long power = (number - 1) >> trailingZeros;
25+
long bases[] = {2, 7, 61};
26+
// sufficient for number < 4,759,123,141
27+
// we dont need to test all the base a < 2(ln number)2
28+
for(long base: bases){
29+
long exp = pow(base % number, power, number);
30+
if(exp <= 1 || exp != number - 1){
31+
continue;
32+
}
33+
for(int i = 0; i < trailingZeros - 1 && exp != number - 1; i++){
34+
exp = (exp * exp) % number; // warning: integer overflow, use mulMod in case of int\long overflow
35+
}
36+
if(exp != number - 1){
37+
return false;
38+
}
39+
}
40+
return true;
41+
}
42+
43+
long pow(long a, long b, long mod){
44+
if(b == 0)
45+
return 1;
46+
if(b == 1)
47+
return a % mod;
48+
long ans = pow(a, b/2, mod);
49+
ans = (ans * ans) % mod;
50+
// mulMod(ans, ans, mod); use when ans^2 does int or long overflow.
51+
// this will perform multiplication using divide and conquer
52+
if(b % 2 == 1)
53+
ans = (a * ans) % mod; // warning: integer overflow
54+
return ans;
55+
}
56+
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /