1.用C语言编程实现一种迭代版本的简单乘法
#include<iostream>
using namespace std;
int multiply(int a, int b)
{
if (b == 0) { return 0; }
if (b % 2 == 0) { return (2 * multiply(a, b / 2)); }
if (b % 2 == 1) { return (2 * multiply(a, b / 2) + a); }
}
int main()
{
int a, b, s;
cin >> a >> b;
s = multiply(a, b);
cout << a << "×" << b << " = " << s;
return 0;
}
2.给出定理1.1(除法算法)的完整证明
定理1.1:对于给定的整数a和b,其中b>0,存在唯一的整数对q(商)和r(余数)使得,a=qb+r且0<=r<b。
证明存在性:构造集合S = {a − bk : k ∈ Z 且 a − bk ≥ 0}.
显然,集合 S 非空,根据良序原则,存在一个最小元 r ∈ S,且 r = a − qb 因此,a = qb + r, r ≥ 0。
若r>=b,则可设r=b+m,其中m ∈ Z 则a=qb+b+m=(q+1)b+m。不符合商和余数的原则。
证明唯一性:假设存在不止一个整数对满足条件,则可设:
a=q1b+r1,a=q2b+r2
不妨设q1>q2,显然,r1<r2.
q1b+r1=q2b+r2,(q1-q2)*b=r2-r1,b=(r2-r1)/(q1-q2)
因为0<=r1<b,0<=r2<b,r1<r2,所以0<r2-r1<b.
因为q1,q2为整数,且q1>q2,所以q1-q2>=1.
因为0<r2-r1<b,q1-q2>=1,所以(r2-r1)/(q1-q2)<b,与b=(r2-r1)/(q1-q2)矛盾
因此,假设不成立 综上,定理1.1得证。
3.用 C 语言编程实现一种迭代版本的gcd算法和一种egcd算法。利用gcd算法,写程序完成以下函数的功能。输入:一个正整数n;输出:大于等于1,小于n,且与n互素的正整数的个数
gcd算法
//迭代版本的gcd算法
int GCD(int a, int b)
{
while (b)
{
int temp = b;
b = a % b;
a = temp;
}
return a;
}
egcd算法
struct RS
{
int d;
int r;
int s;
};
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;
}
函数
#include <stdio.h>
int Gcd(int a, int b) {
while (b != 0) {
int temp = b;
b = a % b;
a = temp;
}
return a;
}
int main()
{
int n,i,cnt=0;
scanf("%d",&n);
for(i=1;i<n;i++)
if(Gcd(i,n)==1)
cnt++;
printf("与%d互素的正整数的个数为%d\n",n,cnt);
return 0;
}
4.第二章的第6、8题
6.假设≡1(mod m)且≡1(mod m)。请证明≡1(mod m)。
证明:由Bezout定理得gcd(a,b)=ar+bs
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。