证明最大公约数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 ...
随机推荐
- Jvm远程监控
服务器运行新建文件 : udi.policy grant codebase "file:${java.home}/../lib/tools.jar" { permission ja ...
- Linux下通过受限bash创建指定权限的账号
在日常业务运维中,有时为了配合解决问题,需要给非运维人员开通系统账号,用于查询日志或代码.通常为了系统安全或避免不必要的误操作等目的,会将账号权限降至最低.下面介绍下在Linux下通过受限bash创建 ...
- redis持久化策略梳理及主从环境下的策略调整记录
redis是一个支持持久化的内存数据库,也就是说redis需要经常将内存中的数据同步到磁盘来保证持久化.可以不定期的通过异步方式保存到磁盘上(即“半持久化模式”):也可以把每一次数据变化都写入到一个A ...
- Dubbo原理和源码解析之服务暴露
github新增仓库 "dubbo-read"(点此查看),集合所有<Dubbo原理和源码解析>系列文章,后续将继续补充该系列,同时将针对Dubbo所做的功能扩展也进行 ...
- vue自定义公共组件components||在vue中,解决修改后的数据不能渲染到dom上的bug
//主页面框架用来嵌入:Main.vue <el-col :span="24" > * { margin: 0; padding: 0; } html { width: ...
- 个人博客Week3——案例分析
一.调研,评测 我使用的bing的WINDOWS客户端,其大致分为四个模块:词典.例句.翻译.应用. (1)“词典”模块 BUG:搜索”http“词条,界面显示http的相关,但是无法再回到最初的主界 ...
- Linux课题实践一
Linux课题实践一 20135318 刘浩晨 1.1应用安装 (1)掌握软件源的维护方法,配置系统使用软件源镜像 删除过期或者重复的软件包:进入”系统设置“-”软件和更新”-”ubuntu软件“- ...
- WebAPI实例--第一个API
今天终于做了第一个任务,学习API之后的第一个实例.销售设置开发API. 第一.层次结构 1.API各层 项目结构主要有五层,分别为API.BizModel.Data.DBModel.Logic. 2 ...
- 软件工程——移动的HelloWorld
package disiti; import java.awt.Color; import java.awt.Cursor; import java.awt.Font; imp ...
- Maven入门系列(一):Eclipse中使用Maven
Maven下载和安装 在使用Maven之前首先先要下载Mavne的免安装包,下载地址:http://maven.apache.org/download.cgi 想看源码的可以下载src版本,使用的下载 ...