E:even 奇数  O:odd 偶数

若(a,b)为(e,e),则gcd(a,b)=2*gcd(a/2,b/2)

若(a,b)为(e,o),则gcd(a,b)=gcd(a/2,b)

若(a,b)为(o,o)[a>=b],则gcd(a,b)=gcd(a,b-a)

证明:

I.若a=c*d b=c*e 则gcd(a,b)=c*gcd(d,e)

这里c=2。

证明:

对于第一个质数,c拥有该质数的个数为ci,d拥有该质数的个数为di,e拥有该质数的个数为ei,而a拥有该质数的个数为ci+di,b拥有该质数的个数为ci+ei。对于任何质数,都有min(ci+di,ci+ei)=ci+min(di,ei),所以gcd(a,b)=c*gcd(d,e)。

如a=56,b=16,c=2,对于质数2, ai=2,bi=4,ci=1,di=1,ei=3,min(2,4)=1+min(1,3)。

II.若a=c*d,但gcd(c,b)=1,则gcd(a,b)=gcd(d,b)

这里c=2。

证明:

对于一个质数,c拥有该质数的个数为ci, d拥有该质数的个数为di,b拥有该质数的个数为bi,而a拥有该质数的个数为ci+di,其中min(ci,bi)=0。对于任何质数,都有min(ci+di,bi)= min(di,bi)(

当ci=0,min(di,bi)=min(di,bi),成立;

当bi=0,min(ci+di,0)=min(di,0),成立),

所以gcd(a,b)=gcd(d,b)。

III. gcd(a,b)=gcd(b,a-bx)

这里x=1

证明:

设gcd(a,b)=d,gcd(b,a-bx)=e,则

∵d|a,d|b

∴d|a-bx

∴d|gcd(b,a-bx),即d|e

∵e|b,e|a-bx

∴e|bx+(a-bx),即e|a

∴e|gcd(a,b),即e|d

∴d=e。证毕。

(来自Jollwish方法)

各种情况分析:

1.(e,e):(x,y)->(x/2,y/2)->…->[(e,o)/(o,e)/(o,o)]

只在开头出现

2.(o,e):(x,y)->(x,y/2)->…->[(o,o)]

偶数不断除以2知道变为奇数

3.(o,o):(x,y)->(x,y-x) [(o,e)]

(o,o)操作一遍变为(o,e),所以出现次数出现次数较少

所以只在开头判断是否为(e,e);每次先判断是否为(o,e)再判断是否为(o,o)

设定(a,b)中a必须为奇数。则一开始若为(e,o),通过两数交换变为(o,e)。当(o,o)时,若a<=b,则(a,b)->(a,b-a);若a>b,则(a,b)->(b,a-b)。

Another Way:

(o,e)中的偶数不停除以2,直到变为奇数,变为(o,o);而(o,o)通过一次操作变为(o,e),重复操作,直到(o,e)中的偶数为0。

这个方法速度更快一点点。

高精度的实现:

高精度加法,高精度减法,高精度除法(高除低,除以2的特殊情况:对于每一位,若为奇数则下一位加1,若为偶数无操作;然后该位除以2)

 #include <stdio.h>
#include <stdlib.h> int main()
{
long a,b,v,c=;
scanf("%ld%ld",&a,&b);
//two evens
//(e,e)->(e,o)/(o,e)/(o,o)
while ((a & )== && (b & )==)
{
a>>=;
b>>=;
c<<=;
}
//(e,o)->(o,e)
if ((a & )== && (b & )==)
{
v=a;
a=b;
b=v;
}
while (a!= && b!=)
{
//odd on the left,even on the right
//(a,b)->(a,b/2)
if ((a & )+(b & )==)
b>>=;
//two odds
//(a,b)->(a,b-a)/(a-b,b)
else
{
//when a<=b , (a,b-a)
if (a<b)
b-=a;
//when a>b , (b,a-b)
else
{
//(a,b)->(a,a-b)
b=a-b;
//(a,a-b)->(b,a-b)
a-=b;
}
}
}
printf("%ld\n",(a+b)*c);
return ;
}
 #include <stdio.h>
#include <stdlib.h> int main()
{
long a,b,v,c=;
scanf("%ld%ld",&a,&b);
//two evens
//(e,e)->(e,o)/(o,e)/(o,o)
while ((a & )== && (b & )==)
{
a>>=;
b>>=;
c<<=;
}
//(e,o)->(o,e)
if ((a & )== && (b & )==)
{
v=a;
a=b;
b=v;
}
while (a!= && b!=)
{
//(o,e) or (o,o)[first time]
//b不会变为0
while ((b & )==)
b>>=;
//(o,o)
//when a<=b , (a,b-a)
if (a<b)
b-=a;
//when a>b , (b,a-b)
else
{
//(a,b)->(a,a-b)
b=a-b;
//(a,a-b)->(b,a-b)
a-=b;
}
}
printf("%ld\n",(a+b)*c);
return ;
}

证明最大公约数Stein算法(高精度算法)的更多相关文章

  1. Summary: gcd最大公约数、lcm最小公倍数算法

    欧几里德算法 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数.其计算原理依赖于下面的定理: 定理:gcd(a,b) = gcd(b,a mod b) 证明:a可以表示成a = kb + ...

  2. LeetCode43,一题让你学会高精度算法

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode系列第22篇文章,今天讲的内容是高精度算法. 今天和大家讨论的算法是高精度,对应的LeetCode是第43题.题面其实 ...

  3. c++减法高精度算法

    c++高精度算法,对于新手来说还是一大挑战,只要克服它,你就开启了编程的新篇章,算法. 我发的这个代码并不是很好,占用内存很多而且运行时间很长(不超过0.02秒),但是很好理解,很适合新手 高精算法的 ...

  4. c++加法高精度算法

    c++高精度算法,对于新手来说还是一大挑战,只要克服它,你就开启了编程的新篇章,算法. 我发的这个代码并不是很好,占用内存很多而且运行时间很长(不超过1秒),但是很好理解,很适合新手 高精算法的本质就 ...

  5. 转载:C++之高精度算法

    C++之高精度算法 注意:本文转载自http://blog.sina.com.cn/s/blog_4fdb102b010087ng.html,十分感谢原作者:忍者    前言:由于计算机运算是有模运算 ...

  6. 高精度算法(C/C++)

    高精度算法 (C/C++) 做ACM题的时候,经常遇到大数的加减乘除,乘幂,阶乘的计算,这时给定的数据类型往往不够表示最后结果,这时就需要用到高精度算法.高精度算法的本质是把大数拆成若干固定长度的块, ...

  7. #AcWing系列课程Level-2笔记——5.高精度“+”算法

    高精度"+"算法 编写高精度"+",记住下面的过程,代码也就游刃有余了! 1.首先我们要明白大整数是如何存储的? 2.其次存储完,如何运算? 高精度" ...

  8. 【蓝桥杯C组】备赛基础篇之高精度算法

    一.高精度加法 思路: 运用vector数组(c选手可用len来记录数组长度,数组去保存数字)将存入字符串里面的数字符倒叙保存,按照小学的加法列式,相加保存进位即可.具体参考代码. 详细代码解析: # ...

  9. 【洛谷】P1009 阶乘之和——高精度算法

    题目描述 用高精度计算出S = 1! + 2! + 3! + - + n!  ( n ≤  50 ) S = 1! + 2! + 3! + - + n! ( n ≤ 50 ) 其中"!&qu ...

随机推荐

  1. [朴智妍][Lullaby]

    歌词来源:http://music.163.com/#/song?id=484056971 作曲 : Bum/Sophiya/김용신 [作曲 : Bum/Sophiya/k/gi-myong-xin] ...

  2. SCRUM 12.23

    距离第二轮迭结束只有几天了. 我们全体组员现在的工作方向都在应用测试上. 明天的任务分配如下 成员 已完成任务 新任务 彭林江 落实API 自动爬虫测试 王卓 提升爬虫程序性能 正确性测试 郝倩 提升 ...

  3. 作业七:Linux内核如何装载和启动一个可执行程序

    作业七:Linux内核如何装载和启动一个可执行程序 一.编译链接的过程和ELF可执行文件格式 可执行文件的创建——预处理.编译和链接 在object文件中有三种主要的类型. 一个可重定位(reloca ...

  4. 77 Linux commands and utilities you'll actually use

    https://searchdatacenter.techtarget.com/tutorial/77-Linux-commands-and-utilities-youll-actually-use

  5. react + dva + ant架构后台管理系统(一)

    一.什么是dva dva是蚂蚁金服推出的一个单页应用框架,对 redux, react-router, redux-saga进行了上层封装,没有引入新的概念,但是极大的程度上提升了开发效率: 二.安装 ...

  6. Python文件os模块

    一.文件操作 1.打开一个文件 fo = open("foo.txt", "wb") fo.write( "www.runoob.com!\nVery ...

  7. CIO知识储备

    1.IT安全和法规知识是CIO的首要 2.IT项目管理专业知识是CIO的必备 3.合作伙伴管理和供应商管理对成功也很关键 4.企业数据管理技能对CIO越来越重要 5.企业财务技能是CIO的一种必备 6 ...

  8. Python从入门到放弃系列(Django/Flask/爬虫)

    第一篇 Django从入门到放弃 第二篇 Flask 第二篇 爬虫

  9. day5 用户交互 input用法

    death_age = 80 name= input("your name:") age= input("your age:") #inputs 接受的所有数据 ...

  10. day29 __eq__ 比较

    本质上 "==" 调用的内部方法就是 __eq__() 正常情况下,两个名字相同的变量比较的是内存地址,内存地址当然是不一样的可以使用__eq__来改变成名字相同就相等 1 cla ...