文章目录
一. C语言编程实现一种迭代版本的简单乘法
代码如下:
#include <iostream>
using namespace std;
int main() {
while (1) {
long long a = 0, b = 0, sum = 0;
printf("请输入要相乘的两个数:\n");
cin >> a >> b;
while (b) {
if (b % 2) {
sum += a;
}
b >>= 1;
a <<= 1;
}
cout << "结果为:" << sum << '\n';
}
return 0;
}
二.定理1.1 除法算法的完整证明
构造集合 S = {a − bk : k ∈ Z 且 a − bk ≥ 0}
1.存在性证明:
显然,r ≥ 0
易知集合S非空,由良序原则知,存在一个最小元 r∈S,且 r = a − bk
假设 r ≥ b,令 r = b + m ,r和b为整数,则m也未自然数
又 r = a - bk,则 m = a - (k+1)b
易知 m < r ,这与良序原则冲突
故 r ≥ b 不成立
即 r < b 得证
2.唯一性证明:
首先,假设不唯一,即存在两个整数对q,r和Q,R使得等式成立,其中,q ≠ Q , r ≠ R ,则会有
qb+r = Qb+R ,即(q-Q)b = R-r ,易知q-Q为整数,则可知R与r相差了b的整数倍,这与1的结论
矛盾,故该假设矛盾,即整数对q和r唯一
三.
迭代版本的gcd算法
代码如下:
int gcd(int a, int b) {
int temp;
while (b != 0) {
temp = b;
b = a % b;
a = temp;
}
return a;
}
(此处a,b均默认为正整数)
迭代版本的egcd算法
代码如下:
int* egcd(int a, int b) {
int* res = new int[3];
int r0 = 1, r1 = 0, s0 = 0, s1 = 1, q = 0, temp = 0, temp_r = 0, temp_s = 0;
while (b != 0) {
q = a / b;
temp = b;
b = a % b;
a = temp;
temp_r = r0 - q * r1;
temp_s = s0 - q * s1;
r0 = r1;
r1 = temp_r;
s0 = s1;
s1 = temp_s;
}
res[0] = r0;
res[1] = s0;
res[2] = a;
return res;
}
利用gcd算法,写程序完成以下函数的功能。输入:一个正整数n,输出:大于等于1,小于n,且与n互素的正整数的个数
代码如下:
#include <iostream>
using namespace std;
int gcd(int a, int b) {
int temp;
while (b != 0) {
temp = b;
b = a % b;
a = temp;
}
return a;
}
int main() {
int n;
printf("请输入一个正整数 n :\n");
cin >> n;
int i = 1, count = 0;
cout << "大于等于1,小于" << n << ",且与" << n << "互素的正整数有:";
while (i < n) {
if (gcd(n, i) == 1) {
count++;
cout << i << " ";
}
i++;
}
cout<<"共有:"<<count<<"个\n";
return 0;
}
四.
第二章第6题
证明如下:
根据 Bézout定理
令
g
c
d
(
a
,
b
)
=
a
r
+
b
s
gcd(a,b)=ar + bs
gcd(a,b)=ar+bs ,则
g
g
c
d
(
a
,
b
)
=
g
a
r
+
b
s
=
(
g
a
)
r
⋅
(
g
b
)
s
g^{gcd(a,b)}=g^{ar+bs}=(g^{a})^{r}\cdot(g^{b})^{s}
ggcd(a,b)=gar+bs=(ga)r⋅(gb)s
则
g
g
c
d
(
a
,
b
)
m
o
d
m
g^{gcd(a,b)}\ mod\ m
ggcd(a,b) mod m =
(
(
g
a
)
r
m
o
d
m
)
⋅
(
(
g
b
)
s
m
o
d
m
)
((g^{a})^{r}mod \ m)\cdot((g^{b})^{s}mod \ m)
((ga)rmod m)⋅((gb)smod m)
又
g
a
m
o
d
m
=
1
g^{a}\ mod\ m=1
ga mod m=1 ,
g
b
m
o
d
m
=
1
g^{b}\ mod\ m=1
gb mod m=1
根据模指数运算,可得
g
g
c
d
(
a
,
b
)
m
o
d
m
g^{gcd(a,b)}\ mod\ m
ggcd(a,b) mod m的结果也为 1
即证得,
g
g
c
d
(
a
,
b
)
≡
1
(
m
o
d
m
)
g^{gcd(a,b)}\equiv 1(mod\ m)
ggcd(a,b)≡1(mod m)
第二章第8题
证明如下:
g
c
d
(
a
,
b
)
=
d
gcd(a,b)=d
gcd(a,b)=d ,则令
a
=
d
∗
a
0
∗
a
1
∗
a
2
∗
.
.
.
a
i
a=d*a_{0}*a_{1}*a_{2}*...a_{i}
a=d∗a0∗a1∗a2∗...ai ,
b
=
d
∗
b
0
∗
b
1
∗
b
2
∗
.
.
.
b
n
b=d*b_{0}*b_{1}*b_{2}*...b_{n}
b=d∗b0∗b1∗b2∗...bn
则
a
/
d
=
a
0
∗
a
1
∗
a
2
∗
.
.
.
a
i
a/d=a_{0}*a_{1}*a_{2}*...a_{i}
a/d=a0∗a1∗a2∗...ai ,
b
/
d
=
b
0
∗
b
1
∗
b
2
∗
.
.
.
b
n
b/d=b_{0}*b_{1}*b_{2}*...b_{n}
b/d=b0∗b1∗b2∗...bn
根据gcd算法的定义,
a
0
,
a
1
,
a
2
.
.
.
a
i
a_{0},a_{1},a_{2}...a_{i}
a0,a1,a2...ai 与
b
0
,
b
1
,
b
2
.
.
.
b
n
b_{0},b_{1},b_{2}...b_{n}
b0,b1,b2...bn 两两互不相等,即
a
/
d
与
b
/
d
a/d与b/d
a/d与b/d互素
即证得,
g
c
d
(
a
/
d
,
b
/
d
)
=
1
gcd(a/d,b/d)=1
gcd(a/d,b/d)=1