数论中求公因子、求模逆的算法
数论中求公因子、求模逆的算法
都是采用欧几里德辗转算法,第一个还好理解,后一个比较复杂,具体的数学原理就不具体介绍了,这是专业的数学问题而不是计算机算法问题。有兴趣可以查看一下数论的书《初等数论》(闵嗣鹤、严士健),对一般人而言够用就行。
都是采用欧几里德辗转算法,第一个还好理解,后一个比较复杂,具体的数学原理就不具体介绍了,这是专业的数学问题而不是计算机算法问题。有兴趣可以查看一下数论的书《初等数论》(闵嗣鹤、严士健),对一般人而言够用就行。
1
import java.util.Vector;
2
3
4
/**
5
* 数论计算
6
* @author xyz
7
*
8
*/
9
10
public 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
import java.util.Vector;2

3

4
/**5
* 数论计算6
* @author xyz7
*8
*/9

10
public class ShuLun {11

12
/**13
* Get GCD14
* @param a15
* @param b16
* @return17
*/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)=141
* @param a42
* @param b43
* @return long[] x,y44
*/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
}else72
{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
}else90
{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 a107
* @param mod108
* @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



浙公网安备 33010602011771号