数论中求公因子、求模逆的算法
数论中求公因子、求模逆的算法
都是采用欧几里德辗转算法,第一个还好理解,后一个比较复杂,具体的数学原理就不具体介绍了,这是专业的数学问题而不是计算机算法问题。有兴趣可以查看一下数论的书《初等数论》(闵嗣鹤、严士健),对一般人而言够用就行。
都是采用欧几里德辗转算法,第一个还好理解,后一个比较复杂,具体的数学原理就不具体介绍了,这是专业的数学问题而不是计算机算法问题。有兴趣可以查看一下数论的书《初等数论》(闵嗣鹤、严士健),对一般人而言够用就行。
1import java.util.Vector;
2
3
4/**
5 * 数论计算
6 * @author xyz
7 *
8 */
9
10public class ShuLun {
11
12 /**
13 * Get GCD
14 * @param a
15 * @param b
16 * @return
17 */
18 static long gcd(long a,long b)
19 {
20 if(a<b)
21 {
22 long temp=a;
23 a=b;
24 b=temp;
25 }
26
27 long c = a;
28 long d = b;
29 long test = 0;
30 while((test = c%d) > 0)
31 {
32 c = d;
33 d = test;
34 }
35
36 return d;
37 }
38
39 /**
40 * Equation ax+by=1,GCD(a,b)=1
41 * @param a
42 * @param b
43 * @return long[] x,y
44 */
45 static long[] getEquationXY(long a,long b)
46 {
47 boolean isChange = false;
48 if(a<b)
49 {
50 long temp=a;
51 a=b;
52 b=temp;
53 isChange = true;
54 }
55
56 int n=0;
57 long k,p0=1,p1=0,q0=0,q1=1,temp;
58
59 long c = a;
60 long d = b;
61 long test = 0;
62 while((test = c%d) > 0)
63 {
64 n++;
65 k = c/d;
66
67 if(n==1)
68 {
69 p1 = k;
70 q1 = 1;
71 }else
72 {
73 temp = p1;
74 p1 = p1*k+p0;
75 p0 = temp;
76
77 temp = q1;
78 q1 = q1*k+q0;
79 q0 = temp;
80 }
81
82 c = d;
83 d = test;
84 }
85
86 if(n%2==1)
87 {
88 p1 = 0 - p1;
89 }else
90 {
91 q1 = 0 - q1;
92 }
93
94 if(isChange)
95 {
96 temp = p1;
97 p1 = q1;
98 q1 = temp;
99 }
100
101 return new long[]{q1,p1};
102 }
103
104 /**
105 * EQ: ax=1 (mod m)
106 * @param a
107 * @param mod
108 * @return inverse,if -1 there's no inverse!
109 */
110 static long getInverse(long a,long m)
111 {
112 if(gcd(a,m)==1)
113 {
114 long xy[] = getEquationXY(a,m);
115 long temp = xy[0]%m;
116 if(temp<0)
117 {
118 temp+=m;
119 }
120 return temp;
121 }
122 return -1;
123 }
124
125
126 public static void main(String arg[])
127 {
128 }
129
130}
131
2
3
4/**
5 * 数论计算
6 * @author xyz
7 *
8 */
9
10public class ShuLun {
11
12 /**
13 * Get GCD
14 * @param a
15 * @param b
16 * @return
17 */
18 static long gcd(long a,long b)
19 {
20 if(a<b)
21 {
22 long temp=a;
23 a=b;
24 b=temp;
25 }
26
27 long c = a;
28 long d = b;
29 long test = 0;
30 while((test = c%d) > 0)
31 {
32 c = d;
33 d = test;
34 }
35
36 return d;
37 }
38
39 /**
40 * Equation ax+by=1,GCD(a,b)=1
41 * @param a
42 * @param b
43 * @return long[] x,y
44 */
45 static long[] getEquationXY(long a,long b)
46 {
47 boolean isChange = false;
48 if(a<b)
49 {
50 long temp=a;
51 a=b;
52 b=temp;
53 isChange = true;
54 }
55
56 int n=0;
57 long k,p0=1,p1=0,q0=0,q1=1,temp;
58
59 long c = a;
60 long d = b;
61 long test = 0;
62 while((test = c%d) > 0)
63 {
64 n++;
65 k = c/d;
66
67 if(n==1)
68 {
69 p1 = k;
70 q1 = 1;
71 }else
72 {
73 temp = p1;
74 p1 = p1*k+p0;
75 p0 = temp;
76
77 temp = q1;
78 q1 = q1*k+q0;
79 q0 = temp;
80 }
81
82 c = d;
83 d = test;
84 }
85
86 if(n%2==1)
87 {
88 p1 = 0 - p1;
89 }else
90 {
91 q1 = 0 - q1;
92 }
93
94 if(isChange)
95 {
96 temp = p1;
97 p1 = q1;
98 q1 = temp;
99 }
100
101 return new long[]{q1,p1};
102 }
103
104 /**
105 * EQ: ax=1 (mod m)
106 * @param a
107 * @param mod
108 * @return inverse,if -1 there's no inverse!
109 */
110 static long getInverse(long a,long m)
111 {
112 if(gcd(a,m)==1)
113 {
114 long xy[] = getEquationXY(a,m);
115 long temp = xy[0]%m;
116 if(temp<0)
117 {
118 temp+=m;
119 }
120 return temp;
121 }
122 return -1;
123 }
124
125
126 public static void main(String arg[])
127 {
128 }
129
130}
131