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. Shell学习笔记一

    Shell 简介 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言. 基本上Shell分两大类:一:图形界面Shell(G ...

  2. 网络编程学习笔记:Socket编程

    文的主要内容如下: 1.网络中进程之间如何通信? 2.Socket是什么? 3.socket的基本操作 3.1.socket()函数 3.2.bind()函数 3.3.listen().connect ...

  3. 《Linux内核设计与实现》第四章学习笔记

    <Linux内核设计与实现>第四章学习笔记           ——进程调度 姓名:王玮怡  学号:20135116 一.多任务 1.多任务操作系统的含义 多任务操作系统就是能同时并发地交 ...

  4. myeclipse快捷方式汇总

    选择你要注释的那一行或多行代码,按Ctrl+/即可,取消注释也是选中之后按Ctrl+/即可. 如果你想使用的快捷键的注释是的话,那么你的快捷键是ctrl+shift+/我以前都是手动注释的,直接打// ...

  5. 【Alpha阶段】展示博客发布!

    1.团队成员简介 Email:qianlxc@126.com Free time:8:00 7:00 a.m ~ 11:00 12:00p.m Introduction: 我是一个热情的人.开朗的人. ...

  6. beanutils的使用

    在项目进行中,使用到beanutils时发现1.9.X以上版本搭配logging搭配使用用不了,实在搞不明白.----stackoverflow提问吧 BeanUtils工具由Apache软件基金组织 ...

  7. log4php的使用方法与详细配置

    log4php的使用 首先引入logger.php文件.log4php可以通过引入logger.php来完成自动加载的过程.文件位置如下: 日志记录器自身没有定义日志的输出目的地和格式,所以我们通常需 ...

  8. [转帖]UEFI和BIOS

    UEFI和Legacy及UEFI+Legacy启动的区别 https://www.cnblogs.com/net5x/p/6850801.html 一直给人装系统 但是连这些最基本的都不知道 感觉自己 ...

  9. laravel 在nginx服务器上除了首页其余都是404的问题

    nginx对应站点的.conf配置文件添加如下代码 location / { try_files $uri $uri/ /index.php$is_args$query_string; #语法: tr ...

  10. 转《trackingjs+websocket+百度人脸识别API,实现人脸签到》流程

    先用websocket与后台建立通讯:用trackingjs在页面调用电脑摄像头,监听人脸,发现有人脸进入屏幕了,就把图片转成base64字符串,通过websocket发送到后端:后端拿到图片,调用百 ...