十初等数论-

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

12
• 分析:
–先明确下各个变量代表的意思:
• x:青蛙A的出发点坐标 • y:青蛙B的出发点坐标 • m:青蛙A一次能跳m米 • n:青蛙B一次能跳n米 • L:纬度线总长L米
–求:需要几步可以相遇
13
假设需要s步可以相遇,则必有以下关系成立 (x + sm) – (y + sn) = kL (k ∈ Z) 变形为: (n – m)s + Lk = x – y (2) 于是我们的题目就变成了求(2)式中s的最 小非负整数解
7
扩展欧几里德算法
程序代码如下: int extended_ gcd(int a, int b, int &x, int &y){ int t, gcd; if (b == 0) { x = 1; y = 0; return a; } gcd = extended_ gcd (b, a%b, x, y); t = x; x = y; y = t – a / b * y; return gcd; }
11
–我们把这两只青蛙分别叫做青蛙A和青蛙B,并 且规定纬度线上东经0度处为原点,由东往西为 正方向,单位长度1米,这样我们就得到了一条 首尾相接的数轴。设青蛙A的出发点坐标是x, 青蛙B的出发点坐标是y。青蛙A一次能跳m米, 青蛙B一次能跳n米,两只青蛙跳一次所花费的 时间相同。纬度线总长L米。现在要你求出它 们跳了几次以后才会碰面。
来自百度文库
• 定理:对于不完全为0的非负整数a,b, gcd(a,b)表示a,b的最大公约数d, 必然存在整数对x,y,使得gcd(a, b)=d=ax+by。
5
扩展欧几里德算法
• 对于gcd(a,b) = d,对(a, b)用欧几里 德辗转相除会最终得到(d, 0)。此时对 于把a =d, b = 0 代入a*x + b*y = d, 显然x = 1,y可以为任意值。 • 我们可以用a = d, b = 0的情况逆推出 来任何gcd(a, b) = d 满足a*x + b*y = d的解。如果x0,y0是b*x + (a%b)*y = d 的解,那么对于a*x + b*y = d的解呢?
8
二元一次不定方程
• 利用扩展欧几里得算法,很容易求得 诸如ax+by=c(1)这样二元一次不定方程 的整数解问题。 • 设a,b的最大公约数为d=(a,b),则 a=a1d, b=b1d,(a1,b1)=1,因此(1)可表 示为: d(a1x+b1y) = c • 于是,当且仅当d|c时(1)方有整数解
素数求法
• 如何求出1~n中的所有素数? • 筛法1: Eraosthenes(爱拉托斯尼筛法)筛法:每次求出 一个新的素数,就把n以内的它的所有倍数都筛去。 经典的Eraosthenes筛法(核心代码): for (int i = 2; i * i < N; i++) { if (tag[i]) continue; for (int j = i; i * j < N; j++) tag[i*j] = 1; } for (int i = 2; i < N; i++) if (!tag[i]) prime[tol++] = i;
1
筛法2: 一种线性筛素数的方法(复杂度是O(n)): void get_prime() { int cnt = 0; for (int i = 2; i < N; i++) { if (!tag[i]) p[cnt++] = i; for (int j = 0; j < cnt && p[j] * i < N; j++) { tag[i*p[j]] = 1; if (i % p[j] == 0) break; } } }
6
扩展欧几里德算法
b*x + (a%b)*y = d → b*x + (a - [a/b]*b)*y = a*y + b*(x - [a/b]*y), 所以a*x + b*y = d的解x1 = y0, y1= x0 [a/b]*y0; 这样我们可以程序迭代了。 注:a,b为正整数,设集合A = {x*a+y*b|x,y是整数},则A中最小正元素是 gcd(a,b)
9
二元一次不定方程
• 显然,若x0,y0为(1)的解,那么对任意整数t有x = x0-bt, y = y0 + at 均为该方程的解 • 因此,可设计一个求解出特解的算法,然后利用这条性质 得到该方程的通解 • 步骤如下: –求解a、b的最大公约数d=(a,b),若d c,则方程无整数解, 否则,将方程两边同时除以d,得到: a0x+b0y=c0 (2) –使用扩展欧几里得算法计算上述方程的解x0,y0,求得特 解x1=x0c0,y1=y0c0。 –代入通解得x=x0c0-a0t,y=y0c0+b0t
14
第三章
同 余
同余是数论中的重要概念,同余理论是研究整数 问题的重要工作之一.本章介绍同余的基本概念,剩 余类和完全剩余系.
15
例3. 求 7 的个位数.
77
解: 7 3(mod10), 7 1(mod10), 7 1(mod10)
1 2 4
2
最大公约数 gcd(最大公因子)
• Euclidean算法求两个正整数a和b的 gcd。先令r0为a,r1为b,接着执行如 下运算:
3
最大公约数
• GCD递归定理:对任意非负整数a和任 意正整数b,gcd(a, b) = gcd(b, a mod b)。
4
Extended-Euclidean 算法
10
• POJ 1061 青蛙的约会
–两只青蛙在网上相识了,它们聊得很开心,于 是觉得很有必要见一面。它们很高兴地发现它 们住在同一条纬度线上,于是它们约定各自朝 西跳,直到碰面为止。可是它们出发之前忘记 了一件很重要的事情,既没有问清楚对方的特 征,也没有约定见面的具体位置。不过青蛙们 都是很乐观的,它们觉得只要一直朝着某个方 向跳下去,总能碰到对方的。但是除非这两只 青蛙在同一时间跳到同一点上,不然是永远都 不可能碰面的。为了帮助这两只乐观的青蛙, 你被要求写一个程序来判断这两只青蛙是否能 够碰面,会在什么时候碰面。
相关文档
最新文档