《数论概论》读书笔记 第5章 整除性与最大公因子数

这章就是讲最大公因子的一些概念和求 gcd 的方法。
高中必修三,就已经知道可以有“辗转相除法”和“更相减损术”等方法能够更快的求出两个数的最大公因数
讲述一些概念。
m 整除n n m的倍数。
如果 m 整除n,我们记为 m|n
如果 m 不整除n,则记为 mn
两个数 a b(不全为零)的最大公因数的最大公因数是整除它们两个的最大公因数,记为 gcd(a,b) 。如果 gcda,b=1 ,我们称 a b互素。

然后这章后面的就是怎么用“辗转相除法”求 gcd 了,并且给了“辗转相除法”的证明。

5.1. 欧几里得算法。(略)

题目解析:
1. gcd(12345,67890)=15gcd(54321,9876)=3.
2.

#include <bits/stdc++.h>
using namespace std;
int gcd(int a,int b)
{
    return b==0?a:gcd(b,a%b);
}
int main()
{
    int a,b;
    while(cin>>a>>b)
    {
        cout<<gcd(a,b)<<endl;
    }
    return 0;
}

3.
推导:
ri=qi+2ri+1+ri+2
ri+1=qi+3ri+2+ri+3
代入得:
ri=(qi+2qi+3+1)ri+2+qi+2ri+3
riri+2=qi+2qi+3+1+qi+2ri+3ri+2>qi+2qi+3+1 .
因为, qi+2qi+3>=1
所以, riri+2>2
即, ri+2<12ri .
因此,最坏情况为每两次计算缩小一半,也就是 2p=t ,其中 tmax(x,y) p 为步数k2。所以有 log2t=p ,将 p=k2 代入,得步数 k=2log2t 。假设 t s位,也就是 k<2log2(10s) ,得到 k<2slog210<7s ,因此可以认为最坏情况大约为位数的 7 倍。

4.
代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b)
{
    return b==0?a:gcd(b,a%b);
}
int main()
{
    ll a,b;
    while(cin>>a>>b)
    {
        cout<<a/gcd(a,b)*b<<endl;
    }
    return 0;
}

(1).
证明: lcm(a,b)=abgcd(a,b).
证明: dlcm(a,b)da,ba,bab/dgcd(a,b)ab/ddab/gcd(a,b) .
所以, lcm(8,12)=24,lcm(20,30)=60,lcm(51,68)=204,lcm(23,18)=414.

(2).
lcm(a,b)=abgcd(a,b).

(3).
证明看 (1).

(4).
lcm(301337,307829)=171460753.

(5).
肯定有多解啊。
对于 gcd(m,n)=18 , 假设 m<=n ,那么有一下解:

18 36
18 54
18 72
18 90
18 108
18 126
18 144
18 162
18 180
18 198
18 216
18 234
18 252
18 270
18 288
18 306
18 324
18 342
18 360
18 378
18 396
18 414
18 432
18 450
18 468
18 486
18 504
18 522
18 540
18 558
18 576
18 594
18 612
18 630
18 648
18 666
18 684
18 702
18 720
18 738
18 756
18 774
18 792
18 810
18 828
18 846
18 864
18 882
18 900
18 918
18 936
18 954
18 972
18 990
18 1008
18 1026
18 1044
18 1062
18 1080
18 1098
18 1116
18 1134
18 1152
18 1170
18 1188
18 1206
18 1224
18 1242
18 1260
18 1278
18 1296
18 1314
18 1332
18 1350
18 1368
18 1386
18 1404
.....
.....
.....

对于 lcm(m,n)=720 ,假设 m<=n ,那么有一下解:

1 720
2 720
3 720
4 720
5 144
5 720
6 720
8 720
9 80
9 240
9 720
10 144
10 720
12 720
15 144
15 720
16 45
16 90
16 180
16 360
16 720
18 80
18 240
18 720
20 144
20 720
24 720
30 144
30 720
36 80
36 240
36 720
40 144
40 720
45 48
45 80
45 144
45 240
45 720
48 90
48 180
48 360
48 720
60 144
60 720
72 80
72 240
72 720
80 90
80 144
80 180
80 360
80 720
90 144
90 240
90 720
120 144
120 720
144 180
144 240
144 360
144 720
180 240
180 720
240 360
240 720
360 720
720 720

5.

(1).(2). 跑一下代码就知道了。有关循环长度的问题,得到 L(21)=8L(13)=10,L(31)=107 。另外,我们可以发现,对于前 100 个数进行试验,最后都是在 4,2,1 上停下来。

(3).
8k+44k+22k+16k+4
8k+524k+1612k+86k+4
所以,当 n=8k+4 n n+1经过 3 步后会变成同一个数,所以,n=8k+4L(n)=L(n+1).

(4).
同理,对 n=128k+28L(n)=L(n+1)=L(n+2) 的证明也可以用(3)中方法。

6.
自己写代码吧…. 3n+1 问题(卡拉兹 (Callatz) 猜想).

代码:

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n = 0;  
    while(cin>>n)
    {
        int ans = n; 
        cout<<n<<" ";
        int len=1;  
        while (1)
        {
            if(n == 1)
            {
                break;
            }
            else
            {
                if (n & 1)
                {
                    n = n* 3 + 1;
                    len++;
                    cout << n << " ";
                }
                else
                {
                    n = n / 2;
                    len++;
                    cout << n << " ";
                }
            }
        }
        printf("\nL(%d)=%d\n",ans,len);
    }
    return 0;
}
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值