package com.hurlant.math
{
    use namespace bi_internal;
    
    /**
     * Modular reduction using "classic" algorithm
     */
    internal class ClassicReduction implements IReduction
    {
        private var m:BigInteger;
        public function ClassicReduction(m:BigInteger) {
            this.m = m;
        }
        public function convert(x:BigInteger):BigInteger {
            if (x.s<0 || x.compareTo(m)>=0) {
                return x.mod(m);
            }
            return x;
        }
        public function revert(x:BigInteger):BigInteger {
            return x;
        }
        public function reduce(x:BigInteger):void {
            x.divRemTo(m, null,x);
        }
        public function mulTo(x:BigInteger, y:BigInteger, r:BigInteger):void {
            x.multiplyTo(y,r);
            reduce(r);
        }
        public function sqrTo(x:BigInteger, r:BigInteger):void {
            x.squareTo(r);
            reduce(r);
        }
    }
}