CINTA第一周作业


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。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值