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

来源:互联网 发布:淘宝钻石展位好吗 编辑:程序博客网 时间:2024/06/06 09:30

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

然后这章后面的就是怎么用“辗转相除法”求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。假设ts位,也就是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 3618 5418 7218 9018 10818 12618 14418 16218 18018 19818 21618 23418 25218 27018 28818 30618 32418 34218 36018 37818 39618 41418 43218 45018 46818 48618 50418 52218 54018 55818 57618 59418 61218 63018 64818 66618 68418 70218 72018 73818 75618 77418 79218 81018 82818 84618 86418 88218 90018 91818 93618 95418 97218 99018 100818 102618 104418 106218 108018 109818 111618 113418 115218 117018 118818 120618 122418 124218 126018 127818 129618 131418 133218 135018 136818 138618 1404...............

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

1 7202 7203 7204 7205 1445 7206 7208 7209 809 2409 72010 14410 72012 72015 14415 72016 4516 9016 18016 36016 72018 8018 24018 72020 14420 72024 72030 14430 72036 8036 24036 72040 14440 72045 4845 8045 14445 24045 72048 9048 18048 36048 72060 14460 72072 8072 24072 72080 9080 14480 18080 36080 72090 14490 24090 720120 144120 720144 180144 240144 360144 720180 240180 720240 360240 720360 720720 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+4nn+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;}