1 package com.hurlant.math
\r
3 use namespace bi_internal;
\r
5 internal class BarrettReduction implements IReduction
\r
7 private var m:BigInteger;
\r
8 private var r2:BigInteger;
\r
9 private var q3:BigInteger;
\r
10 private var mu:BigInteger;
\r
12 public function BarrettReduction(m:BigInteger) {
\r
14 r2 = new BigInteger;
\r
15 q3 = new BigInteger;
\r
16 BigInteger.ONE.dlShiftTo(2*m.t, r2);
\r
21 public function revert(x:BigInteger):BigInteger
\r
30 * @param r = x*y mod m; x != r
\r
33 public function mulTo(x:BigInteger, y:BigInteger, r:BigInteger):void
\r
42 * @param r = x^2 mod m; x != r
\r
45 public function sqrTo(x:BigInteger, r:BigInteger):void
\r
51 public function convert(x:BigInteger):BigInteger
\r
53 if (x.s<0 || x.t>2*m.t) {
\r
55 } else if (x.compareTo(m)<0) {
\r
58 var r:BigInteger = new BigInteger;
\r
67 * @param x = x mod m (HAC 14.42)
\r
70 public function reduce(lx:BigInteger):void
\r
72 var x:BigInteger = lx as BigInteger;
\r
73 x.drShiftTo(m.t-1,r2);
\r
78 mu.multiplyUpperTo(r2, m.t+1, q3);
\r
79 m.multiplyLowerTo(q3, m.t+1, r2);
\r
80 while (x.compareTo(r2)<0) {
\r
81 x.dAddOffset(1, m.t+1);
\r
84 while (x.compareTo(m)>=0) {
\r