证明最大公约数Stein算法(高精度算法)
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算法(高精度算法)的更多相关文章
- Summary: gcd最大公约数、lcm最小公倍数算法
欧几里德算法 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数.其计算原理依赖于下面的定理: 定理:gcd(a,b) = gcd(b,a mod b) 证明:a可以表示成a = kb + ...
- LeetCode43,一题让你学会高精度算法
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode系列第22篇文章,今天讲的内容是高精度算法. 今天和大家讨论的算法是高精度,对应的LeetCode是第43题.题面其实 ...
- c++减法高精度算法
c++高精度算法,对于新手来说还是一大挑战,只要克服它,你就开启了编程的新篇章,算法. 我发的这个代码并不是很好,占用内存很多而且运行时间很长(不超过0.02秒),但是很好理解,很适合新手 高精算法的 ...
- c++加法高精度算法
c++高精度算法,对于新手来说还是一大挑战,只要克服它,你就开启了编程的新篇章,算法. 我发的这个代码并不是很好,占用内存很多而且运行时间很长(不超过1秒),但是很好理解,很适合新手 高精算法的本质就 ...
- 转载:C++之高精度算法
C++之高精度算法 注意:本文转载自http://blog.sina.com.cn/s/blog_4fdb102b010087ng.html,十分感谢原作者:忍者 前言:由于计算机运算是有模运算 ...
- 高精度算法(C/C++)
高精度算法 (C/C++) 做ACM题的时候,经常遇到大数的加减乘除,乘幂,阶乘的计算,这时给定的数据类型往往不够表示最后结果,这时就需要用到高精度算法.高精度算法的本质是把大数拆成若干固定长度的块, ...
- #AcWing系列课程Level-2笔记——5.高精度“+”算法
高精度"+"算法 编写高精度"+",记住下面的过程,代码也就游刃有余了! 1.首先我们要明白大整数是如何存储的? 2.其次存储完,如何运算? 高精度" ...
- 【蓝桥杯C组】备赛基础篇之高精度算法
一.高精度加法 思路: 运用vector数组(c选手可用len来记录数组长度,数组去保存数字)将存入字符串里面的数字符倒叙保存,按照小学的加法列式,相加保存进位即可.具体参考代码. 详细代码解析: # ...
- 【洛谷】P1009 阶乘之和——高精度算法
题目描述 用高精度计算出S = 1! + 2! + 3! + - + n! ( n ≤ 50 ) S = 1! + 2! + 3! + - + n! ( n ≤ 50 ) 其中"!&qu ...
随机推荐
- 系统重启后DNS地址默认修改修改引起的一次事故(Tomcat报错:java.net.UnknownHostException)
事故描述:公司的一个内部业务系统由于程序bug,导致系统崩溃,需要强制重启服务器.系统重启后,赶紧将业务程序启动.随后发现/etc/resolv.conf文件的DNS地址被修改成了默认地址.发现之后, ...
- 最近新明白的SQL小知识
1.partition by和order by 先看三个小需求: ①查询出各个类编号的书本的数量. select count (类编号) as 数量, 类编号 from Books group by ...
- 四则运算法则在Java中的实现
软件工程的课程已经上过有一段时间了,前段时间由于比较忙着考试,所以关于四则运算的代码一直没有实现.同时由于近来一段时间一直在自学java,因为C++虽然也是面向对象,而且可以开发很多软件或者程序,但是 ...
- MyEclipse项目里面出现红叉的解决方案?
一般出现在从别处import的项目上,只有项目文件夹上有红叉,其他地方都正常,现总结个人的几个解决方案: 有几种可能: 1,编码设置是否一致,也即是你项目原来的编码和现在eclipse用的默认编码 ...
- spring mvc的工作原理
该文转载自:http://blog.csdn.net/u012191627/article/details/41943393 SpringMVC框架介绍 1) spring MVC属于SpringFr ...
- Building Java Projects with Gradle
https://spring.io/guides/gs/gradle/ Gradle学习系列教程 https://blog.csdn.net/column/details/gradle-transla ...
- From 简书 转帖一下如何安装k8s1.10 改天做下实验. https://www.jianshu.com/p/9c7e1c957752
centos7.3 kubernetes/k8s 1.10 离线安装 老菜_misa 关注 2018.04.25 23:57 字数 1243 阅读 266评论 1喜欢 3 本文介绍在centos7.3 ...
- []转帖] 浅谈Linux下的五种I/O模型
浅谈Linux下的五种I/O模型 https://www.cnblogs.com/chy2055/p/5220793.html 一.关于I/O模型的引出 我们都知道,为了OS的安全性等的考虑,进程是 ...
- MiniDP与HDMI的关系
高清输出革命先行者:HDMI接口 HDMI高清晰度多媒体接口(英文:High Definition Multimedia Interface,HDMI)是一种数字化视频/音频接口技术,是适合影像传输的 ...
- Angular injector注入器
<!DOCTYPE html><html ng-app="myApp"><head lang="en"> <meta ...