转自http://www.programfan.com/club/showbbs.asp?id=227318&page=1
bpttc的发言
int GCD_Stein( int x, int y )
{
        int factor = 0;
        int temp;
        if ( x < y )
        {
                temp = x;
                x = y;
                y = temp;
        }
        while ( x != y )
        {
                if ( x & 0x1 )
                {/* when x is odd */
                        if ( y & 0x1 )
                        {/* when x and y are both odd */
                                y = ( x - y ) >> 1;
                                x -= y;
                        }
                        else
                        {/* when x is odd and y is even */
                                y >>= 1;
                        }
                }
                else
                {/* when x is even */
                        if ( y & 0x1 )
                        {/* when x is even and y is odd */
                                x >>= 1;
                                if ( x < y )
                                {
                                        temp = x;
                                        x = y;
                                        y = temp;
                                }
                        }
                        else
                        {/* when x and y are both even */
                                x >>= 1;
                                y >>= 1;
                                ++factor;
                        }
                }
        }
        return ( x << factor );
}
Stein算法
对两个正整数 x>y :
1.均为偶数 gcd(x,y)=2gcd(x/2,y/2);
2.均为奇数 gcd(x,y)=gcd((x+y)/2,(x-y)/2);
2.x奇y偶   gcd(x,y)=gcd(x,y/2);
3.x偶y奇   gcd(x,y)=gcd(x/2,y) 或 gcd(x,y)=gcd(y,x/2);(注意此时判断 x/2和y的大小)

评论