关于GCD的几个结论

设a和b的最大公约数是d,那么:

1. d是用sa+tb(s和t都是整数)能够表示的最小正整数

  证明:设x=sa+tb是sa+tb能够表示出的最小正整数。首先,有d|x,证明如下:

    因此有x>=d,现在只要证明x是公约数,就可以证明x就是这个最大公约数了。只需证明x|a且x|b。

    先证x|a。设a=qx+r(q是自然数,0<=r<x),那么r=a-qx=a-q(sa+tb)=(1-qs)a+(-qt)b。可以看出r也满足Sa+Tb这种形式,假如r也是正整数的话,r<x,那么与x是Sa+Tb这种形式的最小正整数矛盾。因此假设不成立,r不是正整数。所以r=0。所以有x|a。

    证x|b同理。

  所以命题得证。有结论:存在整数s,t使得sa+tb=d,其中d=gcd(a,b)。并且d是形如sa+tb的所有正整数里最小的。

2. c是a和b的公约数,那么c|d

  证明:由命题1,存在整数s,t,使得sa+tb=d。由于a=pc,b=qc(p,q都是正整数),所以d=spc+tqc=(sp+tq)c。所以c|d。

  所以命题得证。有结论:任何公约数都整除最大公约数。

3. 如果c|d,那么有c|a且c|b

  证明:显然有d|a且d|b。由整除的传递性,就有c|a且c|b。

  由命题2和命题3得出推论:一个数整除最大公约数,跟这个数分别整除这两个数是等价的条件。

  这是今天在看莫比乌斯反演的时候有一步转化没有看懂,就在这里推了一下。

  

时间: 2024-10-15 09:55:03

关于GCD的几个结论的相关文章

POJ2480:Longge&#39;s problem(欧拉函数的应用)

题目链接:传送门 题目需求: Given an integer N(1 < N < 2^31),you are to calculate ∑gcd(i, N) 1<=i <=N. 这题就是上一篇博客的变形. 题目解析:首先先求出与N互质的个数,即N的欧拉函数值,之后分解出N的因子来,求解方法如下. 证明: 要求有多少个 i 满足gcd(i, N) = d 如果gcd(i, N) = d,则gcd(i/d, N/d) = 1 由于i <= N,所以 i/d <= N/d,

有关Gcd,Lcm的一点小结论

先介绍两个: 大数的Gcd Stein+欧几里德 function stein(a,b:int64):int64; begin if a<b then exit(stein(b,a)); if b=0 then exit(a); if ((a and 1)=0) and ((b and 1)=0) then exit(stein(a>>1,b>>1)<<1); if (a and 1)=0 then exit(stein(a>>1,b)); if (b

iOS开发之多线程技术——GCD篇

本篇将从四个方面对iOS开发中GCD的使用进行详尽的讲解: 一.什么是GCD 二.我们为什么要用GCD技术 三.在实际开发中如何使用GCD更好的实现我们的需求 一.Synchronous & Asynchronous 同步 & 异步 二.Serial Queues & Concurrent Queues 串行 & 并发 三.Global Queues全局队列 四.Main Queue主队列 五.同步的作用 六.dispatch_time延迟操作 七.线程安全(单例dispa

GCD介绍(转)

GCD介绍(一): 基本概念和Dispatch Queue GCD提供很多超越传统多线程编程的优势: 易用: GCD比之thread跟简单易用.由于GCD基于work unit而非像thread那样基于运算,所以GCD可以控制诸如等待任务结束.监视文件描述符.周期执行代码以及工作挂起等任务.基于block的血统导致它能极为简单得在不同代码作用域之间传递上下文. 效率: GCD被实现得如此轻量和优雅,使得它在很多地方比之专门创建消耗资源的线程更实用且快速.这关系到易用性:导致GCD易用的原因有一部

hdu_1695: GCD 【莫比乌斯反演】

题目链接 这题求[1,n],[1,m]gcd为k的对数.而且没有顺序. 设F(n)为公约数为n的组数个数 f(n)为最大公约数为n的组数个数 然后在纸上手动验一下F(n)和f(n)的关系,直接套公式就好了.注意要删去重复的. 关于 莫比乌斯反演 的结论 #include<bits/stdc++.h> using namespace std; typedef long long LL; const int maxn=1e6; int prime[maxn+5]; bool check[maxn+

深入了解GCD

首先提出一些问题: dispatch_async 函数如何实现,分发到主队列和全局队列有什么区别,一定会新建线程执行任务么? dispatch_sync 函数如何实现,为什么说 GCD 死锁是队列导致的而不是线程,死锁不是操作系统的概念么? 信号量是如何实现的,有哪些使用场景? dispatch_group 的等待与通知.dispatch_once 如何实现? dispatch_source 用来做定时器如何实现,有什么优点和用途? dispatch_suspend 和 dispatch_res

格而知之9:一些关于GCD的笔记

1.最近在重读当年刚开始学习多线程时的笔记,发觉其中有一些地方还是比较容易模糊,于是整理这篇笔记记录一下. 执行方式和队列 2.队列用来存放管理要执行的任务,它分为并发队列(Concurrent Dispatch Queue)和串行队列(Serial Dispatch Queue): 并发队列:队列内的任务允许被分配给多条线程同时执行: 串行队列:队列内的任务只能被放在一条线程内顺序执行. 3.执行方式分为异步(Asynchronization)和同步(Synchronization): 异步:

最大公约数(gcd)和 最小公倍数(lcm)——辗转相除法

辗转相除法(又称欧几里得算法)是求最大公因数的算法 要求a,b的最大公约数(a>b),我们可以递归地求b,a%b的最大公约数,直到其中一个数变成0,这时另一个数就是a,b的最大公约数. C++实现: int gcd(int a,int b){ retuen b?gcd(b,a%b):a; } 或: while(b!=0)  {  temp=a%b;   a=b;   b=temp; } 证明:(引自百度百科) 设两数为a.b(b<a),用gcd(a,b)表示a,b的最大公约数,r=a (mod

【Luogu】P1072Hankson的趣味题(gcd)

这题真TM的趣味. 可以说我的动手能力还是不行,想到了算法却写不出来.以后说自己数论会GCD的时候只好虚了-- 我们首先这么想. x与a0的最大公约数为a1,那么我们把x/=a1,a0/=a1之后,x和a0不会再有除了1之外的公约数. 证明:设x/a1=c,a0/a1=d. 若有gcd(c,d)=y 则有p=c/y,q=d/y. 反之c=py,d=qy. 则有x=pya1,a0=qya1. 则x和a0共有公约数ya1. y属于正实数集,因此ya1>a1. 因此gcd(x,a0)=ya1. 又因为