二进制GCD算法解析
UPD 2018.3.30 这个好像就是更相减损术的样子emmm
UPD 2018.5.22 好像不是更相减损术而是叫Stein算法的样子emmm
蒟蒻来做个二进制GCD笔记。
为什么要写这个东西呢,因为按照ysy神犇在这次luogu夏令营的说法,常数会小很多。
我再查了一下(ysy神犇没说实现啊orz),这玩意的原理说起来大概是这样的:
因为普通的辗转相除法求gcd需要用到取模,所以常数比较慢。
我们使用另一种算法:
求gcd(a,b)。有三种情况:
1.a,b为偶数,则gcd(a,b)=2*gcd(a/2,b/2)
2.a为奇数,b为偶数,则gcd(a,b)=gcd(a,b/2)
3.a,b为奇数。假设a>=b,则gcd(a,b)=gcd((a-b)/2,b)
4.a为0,则返回b
然后以上的除法和判奇偶性可以使用位运算处理。
取较大值可以使用内联函数降低常数。
然后....emmm
下面是两种算法的执行时间。原题:BZOJ 入门P1234

可能是范围开的不够大?(一脸懵逼)
然后我自己测了一组比较大的数据。
9223372036854775800 529215046068469760
每个程序运行5次,忽略误差较大的运行,取平均值,得到的数据如下:
普通gcd算法:13.576ms
二进制gcd算法:13.044ms
总之...emm,掌握还是很简单的。
至于什么时候用...各位见仁见智吧。
代码如下:
#include<iostream>
using namespace std;
typedef long long ll;
inline ll abs(ll x){
return x<?-x:x;
}
inline ll min(ll a,ll b){
return a<b?a:b;
}
inline ll gcd(ll a,ll b){
if(a==)return b;
if(b==)return a;
if(!(a&)&&!(b&))return *gcd(a>>,b>>);
else if(!(a&))return gcd(a>>,b);
else if(!(b&))return gcd(a,b>>);
else return gcd(abs(a-b),min(a,b));
} int main(){
ll a,b;
cin>>a>>b;
cout<<"gcd="<<gcd(a,b);
return ;
}
二进制GCD算法解析的更多相关文章
- 二进制GCD算法 减少%的时间消耗
/* 二进制求最大公约数.由于传统的GCD,使用了%,在计算机运行过程中要花费大量的时间,所以,采取二进制的求法,来减少时间的消耗. 算法: 当a,b都是偶数时: gcd(a,b)=2*gcd(a/2 ...
- 【数论】二进制GCD
二进制GCD GCD这种通用的算法相信每个OLER都会 ,辗转相除,代码只有四行 : int GCD(int a,int b){ if(b==0) return a; return GCD(b ...
- 不同的GCD算法
分类: C语言程序2014-10-08 15:10 28人阅读 评论(0) 收藏 举报 gcdC语言程序位运算 早在公元前300年左右,欧几里得就在他的著作<几何原本>中给出了高效的解法- ...
- Android逆向之旅---Android中锁屏密码算法解析以及破解方案
一.前言 最近玩王者荣耀,下载了一个辅助样本,结果被锁机了,当然破解它很简单,这个后面会详细分析这个样本,但是因为这个样本引发出的欲望就是解析Android中锁屏密码算法,然后用一种高效的方式制作锁机 ...
- 区块链~Merkle Tree(默克尔树)算法解析~转载
转载~Merkle Tree(默克尔树)算法解析 /*最近在看Ethereum,其中一个重要的概念是Merkle Tree,以前从来没有听说过,所以查了些资料,学习了Merkle Tree的知识,因为 ...
- 地理围栏算法解析(Geo-fencing)
地理围栏算法解析 http://www.cnblogs.com/LBSer/p/4471742.html 地理围栏(Geo-fencing)是LBS的一种应用,就是用一个虚拟的栅栏围出一个虚拟地理边界 ...
- gcd和拓展gcd算法
gcd算法是用来求两个数最大公约数的算法,他是依靠辗转相除(中国好像叫辗转相减)法来求两个数的最大公约数,别的地方也有很多介绍不做过多赘述,主要提供代码供自己参考. gcd(int a,int b) ...
- KMP串匹配算法解析与优化
朴素串匹配算法说明 串匹配算法最常用的情形是从一篇文档中查找指定文本.需要查找的文本叫做模式串,需要从中查找模式串的串暂且叫做查找串吧. 为了更好理解KMP算法,我们先这样看待一下朴素匹配算法吧.朴素 ...
- Peterson算法与Dekker算法解析
进来Bear正在学习巩固并行的基础知识,所以写下这篇基础的有关并行算法的文章. 在讲述两个算法之前,需要明确一些概念性的问题, Race Condition(竞争条件),Situations lik ...
随机推荐
- Flask项目中数据库迁移的使用
数据库迁移 在开发过程中,需要修改数据库模型,而且还要在修改之后更新数据库.最直接的方式就是删除旧表,但这样会丢失数据. 更好的解决办法是使用数据库迁移框架,它可以追踪数据库模式的变化,然后把变动应用 ...
- L148
You don't know about real loss, because that only occurs when you love something more than you love ...
- 【dlbook】实践方法论
[性能度量] 使用什么误差度量? 目标性能大致为多少? [默认的基准模型] 首先尝试分段线性单元,ReLU以及扩展. SGD一般是合理的选择,选加入动量的版本,衰减方法不一. 批标准化在优化出现问题时 ...
- PostgreSQL提升为主库 时间线加一的问题
在使用PostgreSQL高可用集群过程中发现一个很难解决的问题,先记录在这里. 我们知道在PG流复制集群中,如果主库死掉了,备库要提升为主库有两种方法: 1)pg_ctl promote 2)创建对 ...
- mysql创建的数据库在电脑什么位置?
你可以在mysql 命令行里执行 show variables like '%datadir%'; 显示出你数据文件的路径,能找到以你创建的数据库的名字的文件夹了.
- ThinkPHP5.0完全开发手册.【CHM】下载
ThinkPHP5已经出来很长时间了,官网也没有提供CHM格式的手册下载只有PDF格式的,我根据官网的在线手册制作了一个离线版的ThinkPHP5.0完全开发手册.CHM格式的文档.
- Lua的清屏快捷方式
1. Lua (Command Line) 这里清屏的方式是: os.execute("cls") 就是执行了DOS中的清屏命令! 2.SciTE中的清屏方式: -----(1)第 ...
- python全局替换文件内容脚本第1版
#!/usr/bin/python #coding=utf8 """ # Author: xiaoyafei # Created Time : 2018-05-08 09 ...
- PyQt: “AttributeError: 'Form' object has no attribute 'exec_'” when opening second window
# -*- coding: utf-8 -*- import sys from PyQt5.QtWidgets import QApplication , QMainWindow from PyQt5 ...
- 物体识别重要指标——平均准确率(Average Precision, AP )
师兄的截图,不知道出处,仅用于学习,多多包涵.