目录
1、用 C 语言编程实现一种迭代版本的简单乘法。
代码如下
int multiply(int a, int b) {
int result = 0;
while (b) {
if (b % 2 == 1) {
result += a ;
}
// a左移一位,b右移一位
a <<= 1;
b >>= 1;
}
return result;
}
2、给出定理1.1(除法算法)的完整证明。
即:证明r<b;证明唯一性
1、证明r<b(反证法):若r>=b,又r=a-qb,即a-qb>=b,即a-(q+1)b>=0;r1=a-(q+1)b,r1<r,则r不是最小元,与题目矛盾,不成立。可证r<b.
2、唯一性证明(反证法):
因为b>0,所以对于任意整数a,总可以找到整数q和r,使得a=qb+r成立。
假设存在另一组整数q’和r’,也满足a=q’b+r’,那么有:qb+r = q’b+r’。两式相减得:b(q-q’) = r’ - r 。
不妨取r’>r,因为0<=r’<b且0<=r<b,所以0<r’-r<b,即0<b(q-q’)<b。又因为q、q’为整数,所以q-q’>=1或=0。所以q=q’。
所以对于给定的a和b,满足a=qb+r的整数对q和r是唯一的。
3、用 C 语言编程实现一种迭代版本的gcd算法和一种egcd算法。利用gcd算法,写程序完成以下函数的功能。输入:一个正整数n;输出:大于等于1,小于n,且与n互素的正整数的个数。
//gcd算法
int gcd(int a, int b) {
if (b == 0)return a;
while (b) {
int c = a % b; a = b; b = c;
}
return a;
}
//egcd算法
int egcd(int a, int b, int *gcd, int *x, int *y) {
int r0 = 1, r1 = 0, s0 = 0, s1 = 1;
while (b) {
int q = a / b;
int temp = b;
b = a % b;
a = temp;
int new_r = r0 - q * r1;
int new_s = s0 - q * s1;
r0 = r1;
r1 = new_r;
s0 = s1;
s1 = new_s;
}
*gcd = a;
*x = r0;
*y = s0;
return a;
}
//输入:一个正整数n;输出:大于等于1,小于n,且与n互素的正整数的个数。
#include <iostream>
using namespace std;
int gcd(int a, int b) {
if (b == 0)return a;
while (b) {
int c = a % b; a = b; b = c;
}
return a;
}
int main() {
int n;
cin >> n;
int counter = 0;
for (int i = 1; i < n; i++) {
if (gcd(i, n) == 1)counter++;
}
cout << counter;
return 0;
}
4、第二章的第6、8题证明。
6、由Bezout定理gcd(a,b)=ar+bs;所以ggcd(a,b)=gar+bs=gar*gbs
由题知ga=1(mod m),所以gar=1(mod m),同理可得gbs=1(mod m)
所以可得gar*gbs=1(mod m),即ggcd(a,b)=1(mod m).
8、gcd(a,b)=d,所以a=md,b=nd;gcd(a/d,b/d)=gcd(m,n)。设gcd(m,n)=k,有m=xk,n=yk;则a=xkd,b=ykd,gcd(a,b)=kd,所以kd=d,所以k=1,可证得gcd(a/d,b/d)=1。