1、用c语言编程实现一种迭代版本的简单乘法
#include<iostream>
using namespace std;
int multiply(int a, int b)
{
int s = 0;
for (int i = 1; i <= b; i++)
{
s = s + a;
}
return s;
}
int main()
{
int a, b, s;
cin >> a >> b;
s = multiply(a, b);
cout << s;
return 0;
}
2、给出定理1.1(除法算法)的完整证明
证明 证明包括两部分:存在性和唯一性。
· 存在性.
构造集合
S = { a - bk : k∈Z 且 a - bk ≥ 0}.
显然,集合S非空. 由良旭原则,存在一个最小元r∈S,且r = a - qb.因此,a = qb + r , r ≥ 0.假设,r < b ,则r = e + b . 因此,a = r + qb = e + b + qb = (1 + q)b + e . 即 e = a - (1 + q)b . 由构造的集合可知,e∈S,因为易知 e < r ,但 r 又是S里的最小元,相矛盾 ,所以r > b .
·唯一性.
思路:所有的q和r都是同一数组:即假设不唯一,推出矛盾
假设 a = q′b + r , q ≠ q′ . 因为 a = qb + r , 两式相减不相等,矛盾
假设 a = qb + r′ , r ≠ r′ . 因为 a = qb + r , 两式相减不相等,矛盾
假设 a = q′b + r′ , q ≠ q′ ,r ≠ r′ . 因为 a = qb + r , 两式相减不相等,矛盾
因此,存在唯一整数对 q 和 r .
3、用C语言编程实现一种迭代版本gcd算法
#include<iostream>
using namespace std;
int GCD(int a, int b)
{
while (a%b)
{
int k;
if (a%b != 0)
{
k = b;
b = a % b;
a = k;
}
else
return b;
}
return b;
}
int main( )
{
int a, b, p;
cout << "输入两个整数" << endl;
cin>>a>>b;
if ( a==0||b == 0)
cout << "输入错误" << endl;
else
p = GCD(a, b);
cout << "gcd(a,b)=" << p << endl;
return 0;
}
egcd算法
利用gcd算法,写程序完成一下函数的功能。输入:一个正整数n ; 输出 : 大于等于1,小于n,且与n互素的正整数的个数。
int gcd(int a, int b) {
while (b) {
a = a % b;
int temp = a;
a = b;
b = temp;
}
return a;
}
int main() {
int n, k = 0;
cin >> n;
if (n == 2)cout << 1 << endl;
else {
for (int i = 1; i < n; i++) {
if (i % 2 == 0)continue;
if (gcd(n, i) == 1)k++;
}
cout << k << endl;
}
}
4、第二章的第6题
证明:由于gcd(a,b)= ar + bs ,设 = a′m + 1 , = b′m + 1 . 所以 = === km +1(k为整数). 因此,≡ 1(mod m).
第二章的第8题
证明:假设a = md , b = nd . 即需证明gcd(m,n)= 1 . 假设gcd(m,n)= f . 则 m = pf ,n = qf ; 则a = pfd , b = qfd . 这说明 fd 能同时被 a 和 b整除 . 然而 gcd(a,b)= d ,即 a 和 b 的最大公约数是 d ,所以 fd ≤ d . 所以 f ≤ 1 ,但 f 是一个正整数,所以 f = 1 . 即 gcd(a/b,b/d)=1 .