用C语言编程实现一种迭代版本的简单乘法
C语言代码如下:
//迭代版本的简单乘法
//位置计数法
int num = 0;
int Mult(int a, int b)
{
if (b == 0)
return num;
if (b & 1)
num += a;
return Mult(a << 1, b >> 1);
}
定理1.1(除法算法)的完整证明
除法算法:
对任意给定的整数a和b,其中b>0,存在唯一的整数对q(商)和r(余数)使得:a=qb+r,且0≤r<b。
证明:
存在性:
构造集合 S={a-bk :k属于Z且a-bk≥0}。 显然集合非空,由良序原则可得,存在一个最小元r(r∈S),且 r=a-qb 。因此,r=a-qb且r≥0。
假设r≥b,令r=b+x(x≥0),所以可得a=qb+r=qb+b+x=(q+1)b+x,违反了除法的商不变原则,所以r≥b 不成立,所以r≤b。
唯一性
假设存在多个q和r满足a=qb+r,则可得 a=q1b+r1,a=q2b+r2。假设q1>q2,显然r1<r2,将两式联立得q1+r1=q2+r2 ⇒ (q1-q2)b=r2-r1 ⇒b=(r2-r1)/(q1-q2)。
因为q1,q2 均为整数且q1>q2,所以q1-q2≥1,又因为r1<r2<b,所以0<r2-r1<b ,可得 (r2-r1)/(q1-q2)<b。与上面矛盾,所以假设不成立。唯一性得证。
所以除法算法得证。
用C语言编程实现一种迭代版本的gcd算法和egcd算法
gcd()算法
欧几里得算法: 给定两个整数a和b,设a≥b,则a和b的最大公因子等于b和a mod b的最大公因子。即gcd(a,b)=gcd(b,a mod b)。
C语言代码如下:
//迭代版本的gcd算法
int GCD(int a, int b)
{
while (b)
{
int temp = b;
b = a % b;
a = temp;
}
return a;
}
egcd()算法
Bézout定理: 设 a 和 b 为非零整数,存在整数 r 和 s 使得:gcd(a, b) = ar + bs,而且,a 与 b 的最大公因子是惟一的。称 r 和 s 为 Bézout 系数。
C语言代码如下:
//迭代版本的egcd算法,ax+by=GCD(a,b)
struct RS
{
int d;//最大公因子
int r;//a的Bezout系数
int s;//b的Bezout系数
};
RS EGCD(int a, int b)
{
int temp, tempx, tempy;
int r0 = 1, s0 = 0, r1 = 0, s1 = 1;
RS rs;
while (b)
{
int p = a / b;
temp = b;
b = a % b;
a = temp;
int tempr0 = r0, temps0 = s0;
r0 = r1, s0 = s1;
r1 = tempr0 - p * r1;
s1 = temps0 - p * s1;
}
rs.r = r0, rs.s = s0, rs.d = a;
return rs;
}
利用gcd算法完成以下函数的功能:
输入:一个正整数n。
输出:大于等于1,小于n且与n互素的正整数的个数。
C语言代码如下:
//大于等于1,小于n,且与n互素的正整数的个数
int Num_gcd_n(int n)
{
int num = 0;
for (int i = 1; i < n; i++)
{
if (GCD(n, i) == 1)
num += 1;
}
return num;
}
第二章6,8题
6题:
题目: 假设 ga ≡ 1 (mod m) 且 gb ≡ 1 (mod m),请证明 ggcd(a,b) ≡ 1 (mod m)。
证明: 在进行证明之前,先写出要用到的mod的两条性质:
乘法性质:(a*b) mod c=(a mod c * b mod c) mod c
幂运算性质: ab mod c=(a mod c)b mod c
根据Bezout定理,存在整数r和s使得gcd(a,b)=ar+bs。结合mod的两条性质可得:
ggcd(a,b) mod m
=gar+bs mod m
=( gar * gbs) mod m
=(gar mod m * gbs mod m) mod m
=[ (ga mod m)r mod m * (gb mod m)s mod m ]
由ga ≡ 1 (mod m)可得ga mod m=1 mod m,同理 gb mod m=1 mod m
将两个式子带入得:
[ (ga mod m)r mod m * (gb mod m)s mod m ]
=[(1 mod m)r mod m * (1 mod m)s mod m
=(1r mod m * 1s mod m) mod m
=(1r *1s) mod m
=1 mod m
即ggcd(a,b) ≡1(mod m)。
8题
题目: 如果 gcd(a, b) = d,则 gcd(a/d, b/d) = 1。
证明: 假设gcd(a/d,b/d)=k(k为正整数且k>1),即k是a/d.b/d的最大公约数。即存在m,n(m≠n),a/d=mk,b/d=nk,所以a=mdk,b=ndk。
此时a,d的最大公约数是dk,因为k>1,所以dk>k,与gcd(a, b) = d矛盾,所以k≤1,又因为k为正整数,所以k=1。即 gcd(a/d, b/d) = 1。