Stein算法

Stein算法主要用于解决超大数取模给欧几里得算法带来局限的问题。

Stein递归算法步骤:Stein(A,B);

1).调整A、B使A>B

2)若A、B都是偶数,则记录下公因子2,然后return 2*Stein(A>>1,B>>1);

3)若A为奇数B为偶数,则return Stein(A,B>>1);

   若B为奇数A为偶数,则return Stein(A>>1,B);

4)若两个都为奇数,则return Stein(abs(A-B),B);

理由:设在某一次过程中A、B的最大公因子为D,可得A=k*D,B=h*D;(A>B -> k>h);  所以A-B=|k-h|*D。A,B都为奇数,有奇偶数乘积奇偶性可得D,k,h都为奇数。所以|k-h|一定是偶数,与h互质,所以A-B与B的最大公因数依旧为D。递归成立!

临界条件:if(B==0)return A;

代码:

#include<cstdio>
#include<algorithm>
using namespace std;

int stein(int a,int b){
    if(a<b)swap(a,b);
    if(b==0)return a;
    if((a&1)==0&&(b&1)==0)return stein(a>>1,b>>1)<<1;
    else if(a&1&&(b&1)==0)return stein(a,b>>1);
    else if(b&1&&(a&1)==0)return stein(a>>1,b);
    else return stein(a-b,b);
}

int main(){
    printf("%d",stein(18,12));
    return 0;
}
咳咳,有件事必须说一下:严格意义上来说,负数和正数之间是没有公因子这一说的【因子要大于0】,但是如果非要求他们的正因子【负因子】,可以先把两个数取绝对值,stein之后再加个符号即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值