@@ -19,9 +19,11 @@ public class DiscreteLogarithm {
1919
2020 public static final long NO_SOLUTION = -1 ;
2121
22- private final HashMap <Long , Long > set = new HashMap <Long , Long >();
22+ private static final HashMap <Long , Long > set = new HashMap <Long , Long >();
2323
24- private long pow (long a , long x , long p ) {
24+ private DiscreteLogarithm () { }
25+
26+ private static final long pow (long a , long x , long p ) {
2527 if (x == 0 )
2628 return 1 ;
2729
@@ -35,7 +37,7 @@ private long pow(long a, long x, long p) {
3537 return (temp * temp ) % p ;
3638 }
3739
38- private long getDiscreteLogarithm (long s , long a , long p ) {
40+ private static final long getDiscreteLogarithm (HashMap < Long , Long > set , long s , long a , long p ) {
3941 for (long i = 0 ; i < s ; ++i ) {
4042 long el = pow (a , (i * s ) % p , p );
4143 el = pow (el , p - 2 , p );
@@ -46,7 +48,8 @@ private long getDiscreteLogarithm(long s, long a, long p) {
4648 return NO_SOLUTION ;
4749 }
4850
49- private void generateSet (long a , long b_1 , long p , long s ) {
51+ private static final void generateSet (long a , long b_1 , long p , long s , HashMap <Long , Long > set ) {
52+ set .clear ();
5053 for (long i = 0 ; i < s ; ++i ) {
5154 final long first = (pow (a , i , p ) * b_1 ) % p ;
5255 if (!set .containsKey (first ))
@@ -57,12 +60,11 @@ private void generateSet(long a, long b_1, long p, long s) {
5760 /**
5861 * Returns DiscreteLogarithm.NO_SOLUTION when a solution cannot be found
5962 */
60- public long countDiscreteLogarithm (final long a , final long b , final long p ) {
63+ public static final long countDiscreteLogarithm (final long a , final long b , final long p ) {
6164 final long s = (long ) sqrt (p ) + 1 ;
6265 final long b_1 = pow (b , p - 2 , p );
63- set .clear ();
6466
65- generateSet (a , b_1 , p , s );
66- return getDiscreteLogarithm (s ,a ,p );
67+ generateSet (a , b_1 , p , s , set );
68+ return getDiscreteLogarithm (set , s ,a ,p );
6769 }
6870}
0 commit comments