# 数论

167人阅读 评论(0)

<!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:黑体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimHei; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:1 135135232 16 0 262144 0;} @font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 0 0 0 415 0;} @font-face {font-family:"/@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:"/@黑体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:1 135135232 16 0 262144 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; font-size:10.5pt; mso-bidi-font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:宋体; mso-font-kerning:1.0pt;} h2 {mso-style-next:正文; margin-top:13.0pt; margin-right:0cm; margin-bottom:13.0pt; margin-left:0cm; text-align:justify; text-justify:inter-ideograph; line-height:173%; mso-pagination:lines-together; page-break-after:avoid; mso-outline-level:2; font-size:16.0pt; font-family:Arial; mso-fareast-font-family:黑体; mso-bidi-font-family:"Times New Roman"; mso-font-kerning:1.0pt;} p.MsoToc2, li.MsoToc2, div.MsoToc2 {mso-style-update:auto; mso-style-noshow:yes; mso-style-next:正文; margin-top:0cm; margin-right:0cm; margin-bottom:0cm; margin-left:21.0pt; margin-bottom:.0001pt; mso-para-margin-top:0cm; mso-para-margin-right:0cm; mso-para-margin-bottom:0cm; mso-para-margin-left:2.0gd; mso-para-margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; font-size:10.5pt; mso-bidi-font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:宋体; mso-font-kerning:1.0pt;} a:link, span.MsoHyperlink {color:blue; text-decoration:underline; text-underline:single;} a:visited, span.MsoHyperlinkFollowed {color:purple; text-decoration:underline; text-underline:single;} pre {margin:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:12.0pt; font-family:宋体; mso-bidi-font-family:宋体;} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;} @page Section1 {size:595.3pt 841.9pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:42.55pt; mso-footer-margin:49.6pt; mso-paper-source:0; layout-grid:15.6pt;} div.Section1 {page:Section1;}-->

## 二、求最大公约数

EUCLID(a,b)

if b=0

then return a

else return EUCLID(b,a mod b)

EUCLID(30,21)=EUCLID(21,9)=EUCLID(9,3)=EUCLID(3,0)=3。

EXTENDED-EUCLID(a,b)

if b=0

then return (a,1,0)

(d',x',y')←EXTEND-EUCLID(b,a mod b)

(d,x,y)=(d',y',x'-floor(a/b)*y')

return (d,x,y)

EXTENDED-EUCLID过程与EUCLID过程的时间复杂度在渐近意义下相同，差别仅在于常数因子，而由此得出的x、y却对解决一些问题十分有用。

## 三、求解同余线性方程

MODULAR-LINEAR-EQUATION-SOLVER(a,b,n)

(d,x',y')←EXTENDED-EUCLID(a,n)

if d|b

then x0←x'(b/d) mod n

for i←0 to d-1

do print (x0+i(n/d)) mod n

else print "no solutions"

线性同余方程

1 例子
2 求特殊解
3 线性同余方程组
4 参见

3x ≡ 2 (mod 6)

5x ≡ 2 (mod 6)

4x ≡ 2 (mod 6)

ax ≡ b (mod n)      (1)

12x ≡ 20 (mod 28)

2x ≡ 2 (mod 6)
3x ≡ 2 (mod 7)
2x ≡ 4 (mod 8)

9k ≡ −1 (mod 7)

42l ≡ −16 (mod 8)

x ≡ 10 (mod 84)

mod表示：取模运算

ax≡b(mod   m)表示：(ax - b) mod m = 0，即同余

gcd(a,b)表示：a和b的最大公约数

int Euclid(int a,int b)
{
if(b == 0)
return a;
else
return Euclid(b,mod(a,b));
}

int mod(int a,int b)
{
if(a >= 0)
return a % b;
else
return a % b + b;
}

= b * x' + (a - a / b * b) * y'
= a * y' + b * (x' - a / b *      y')
= a * x + b * y

y = x' - a / b * y'

triple Extended_Euclid(int a,int b)
{
triple result;
if(b == 0)
{
result.d = a;
result.x = 1;
result.y = 0;
}
else
{
triple ee = Extended_Euclid(b,mod(a,b));
result.d = ee.d;
result.x = ee.y;
result.y = ee.x - (a/b)*ee.y;
}
return result;
}

struct triple
{
int d,x,y;
};

int MLES(int a,int b,int n)
{
triple ee = Extended_Euclid(a,n);
if(mod(b,ee.d) == 0)
return mod((ee.x * (b / ee.d)),n / ee.d);
else
return -1;
}//返回-1为无解，否则返回的是方程的最小解

## 四、中国剩余定理

「今有物，不知其数，三三数之，剩二，五五数之，剩三，七七数之，剩二，问物几何？」

设n=n1*n2...nk, 其中因子两两互质.有:  a-----(a1,a2,...,ak), 其中ai = a mod ni, 则 a和(a1,a2,...,ak)关系是一一对应的.就是说可以由a求出(a1,a2,...,ak), 也可以由(a1,a2,...,ak)求出a

对于a=ai  (mod ni) 的同余方程,有唯一解

则a = (a1*c1+a2*c2+...+ak*ck)      (mod n)      (注:由此等式可求a%n,当n很大时)

mi*mf  mod ni = 1 => mi*mf+ni*y=1;

#include <iostream>

#include <cmath>

using namespace std;

const int MAXN = 100;

int nn, a[MAXN], n[MAXN];

int egcd(int a, int b, int& x, int &y) {

int d;

if (b == 0) {

x = 1; y = 0;

return a;

} else {

d = egcd(b, a%b, y, x);

y -= a/b*x;

return d;

}

}

int lmes() {

int i, tm=1, mf, y, ret=0, m;

for (i=0; i<nn; i++) tm *= n[i];

for (i=0; i<nn; i++) {

m = tm/n[i];

egcd(m, n[i], mf, y);

ret += (a[i]*m*(mf%n[i]))%tm;

}

return (ret+tm)%tm;

}

int main() {

a[0] = 4; a[1] = 5;

n[0] = 5; n[1] = 11;

nn = 2;

printf("%d/n", lmes());

return 0;

}

## 五、模取幂运算

m^e mod n叫做模取幂运算，事实上，m^e mod n可以直接计算，没有必要先算m^e，根据简单的数论知识，很容易设计一个分治算法。具体如下:

Modular-Exponentiation(a, b, n)

c ← 0

d ← 1

设<b[k],b[k-1],..b[0]>是b的二进制表示

for i←k downto 0

do c ← 2c

d ← (d*d) mod n

if b[i] = 1

then c ← c + 1

d ← (d*a) mod n

return d

a^(2c) mod n = (a^c mod n)^2

a^(2c+1) mod n = a * (a^c mod n)^2

## 六、RSA公钥加密系统

M=SA(PA(M))且M=PA(SA(M))。

1. 随机选择两个不等素数p和q。

2. 计算出n=pq。

3. 选择一个小奇数e使它和(p-1)(q-1)互质。

4. 计算e在模(p-1)(q-1)的逆元d。

5. 公开数对(e,n)作为RSA公钥。

6. 保留数对(d,n)作为他的RSA密钥。

## 参考材料：

1、常用的数论算法（C++描述）

http://blog.csdn.net/yahreso/archive/2008/02/18/2104191.aspx

2、计算数论(2)

http://www.wangchao.net.cn/shop/product_634448.html

3数论基础算法

0
0

* 以上用户言论只代表其个人观点，不代表CSDN网站的观点或立场
个人资料
• 访问：20969次
• 积分：379
• 等级：
• 排名：千里之外
• 原创：13篇
• 转载：22篇
• 译文：0篇
• 评论：0条
文章存档