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

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131
