const BigInteger BinaryDivide::Div(const BigInteger &a, const BigInteger &b){ if(b>a) return BigInteger("0",a.GetSystem()); if(b==a) return BigInteger("1",a.GetSystem()); BigInteger l("1",b.GetSystem()),r=a,m; BigInteger one("1",b.GetSystem()); while(l<r){ m=(l+r+one)/2; if(a<m*b) r=m-one; else l=m; } return l; }
BigInteger Algorithms::gcd(BigInteger a, BigInteger b){ //if() return a; BigInteger zero("0",a.GetSystem()); while(a!=zero && b!=zero){ std::cout<<"iteration "<<a<<" "<<b<<std::endl; if(a>b) a=a%b; else b=b%a; } return a+b; }
BigInteger Algorithms::sqrt(BigInteger const &a){ BigInteger left("1",a.GetSystem()) ,right(a),middle; BigInteger one("1",middle.GetSystem()); while(left<right){ middle=(left+right+one)/2; if(middle*middle>a) right=middle-one; else left=middle; } return left; }