证明最大公约数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 ...
随机推荐
- SQL多表查询总结
前言 连接查询包括合并.内连接.外连接和交叉连接,如果涉及多表查询,了解这些连接的特点很重要.只有真正了解它们之间的区别,才能正确使用. 一.Union UNION 操作符用于合并两个或多个 SELE ...
- 这是一个数学题牛客训练赛E
题目描述 https://www.nowcoder.net/acm/contest/78/E 已知有一个n+1个数的数列,对于给定的A0和An ,当i满足当1<=i<=n-1时有 ...
- 作业6-COSPLAY孩子他家长
为了我提高我女儿的数学能力,我以下我会根据我想要的功能做出相应的解决方案,为了孩子,父母也可以想的比老师周到.可怜天下父母心. 编号. 名称. ...
- 第三个Sprint冲刺第四天(燃尽图)
- 机器学习算法(KNN)
KNN简介 KNN(k-NearestNeighbor)算法的思想总结一下:就是在数据和标签已知的情况下,输入测试数据,将测试数据的特征与训练集中对应的特征进行相互比较,找到训练集中与之最为相似的前K ...
- PAT 1039 到底买不买
https://pintia.cn/problem-sets/994805260223102976/problems/994805283241443328 小红想买些珠子做一串自己喜欢的珠串.卖珠子的 ...
- the confilict between validation and readonly in jquery
How can I disable jquery validation on readonly fields? http://stackoverflow.com/questions/10803294/ ...
- Delphi的idhttp报IOHandler value is not valid错误的原因[转]
出现这种问题的原因是由于访问的 URL地址为https或存在其跳转地址为https. 首先单纯使用idhttp是只能访问http,而https则需要搭配IdSSLIOHandlerSocketOpen ...
- C++拷贝构造函数的调用时机
一.拷贝构造函数调用的时机 当以拷贝的方式初始化对象时会调用拷贝构造函数,这里需要注意两个关键点,分别是以拷贝的方式和初始化对象 1. 初始化对象 初始化对象是指,为对象分配内存后第一次向内存中填 ...
- 转《trackingjs+websocket+百度人脸识别API,实现人脸签到》流程
先用websocket与后台建立通讯:用trackingjs在页面调用电脑摄像头,监听人脸,发现有人脸进入屏幕了,就把图片转成base64字符串,通过websocket发送到后端:后端拿到图片,调用百 ...