Пример #1
0
		public SimpleBigDecimal Add(SimpleBigDecimal b)
		{
			CheckScale(b);
			return new SimpleBigDecimal(bigInt.Add(b.bigInt), scale);
		}
Пример #2
0
		public SimpleBigDecimal Subtract(SimpleBigDecimal b)
		{
			return Add(b.Negate());
		}
Пример #3
0
		private SimpleBigDecimal(SimpleBigDecimal limBigDec)
		{
			bigInt = limBigDec.bigInt;
			scale = limBigDec.scale;
		}
Пример #4
0
		private void CheckScale(SimpleBigDecimal b)
		{
			if (scale != b.scale)
				throw new ArgumentException("Only SimpleBigDecimal of same scale allowed in arithmetic operations");
		}
Пример #5
0
		public int CompareTo(SimpleBigDecimal val)
		{
			CheckScale(val);
			return bigInt.CompareTo(val.bigInt);
		}
Пример #6
0
		public BigInteger Round()
		{
			SimpleBigDecimal oneHalf = new SimpleBigDecimal(BigInteger.One, 1);
			return Add(oneHalf.AdjustScale(scale)).Floor();
		}
Пример #7
0
		public SimpleBigDecimal Multiply(SimpleBigDecimal b)
		{
			CheckScale(b);
			return new SimpleBigDecimal(bigInt.Multiply(b.bigInt), scale + scale);
		}
Пример #8
0
 public SimpleBigDecimal Subtract(SimpleBigDecimal b)
 {
     return(Add(b.Negate()));
 }
Пример #9
0
 private SimpleBigDecimal(SimpleBigDecimal limBigDec)
 {
     bigInt = limBigDec.bigInt;
     scale  = limBigDec.scale;
 }
Пример #10
0
 public SimpleBigDecimal Add(SimpleBigDecimal b)
 {
     CheckScale(b);
     return(new SimpleBigDecimal(bigInt.Add(b.bigInt), scale));
 }
Пример #11
0
        public BigInteger Round()
        {
            SimpleBigDecimal oneHalf = new SimpleBigDecimal(BigInteger.One, 1);

            return(Add(oneHalf.AdjustScale(scale)).Floor());
        }
Пример #12
0
 public int CompareTo(SimpleBigDecimal val)
 {
     CheckScale(val);
     return(bigInt.CompareTo(val.bigInt));
 }
Пример #13
0
 public SimpleBigDecimal Multiply(SimpleBigDecimal b)
 {
     CheckScale(b);
     return(new SimpleBigDecimal(bigInt.Multiply(b.bigInt), scale + scale));
 }
Пример #14
0
		/**
		* Computes the norm of an element <code>&#955;</code> of
		* <code><b>R</b>[&#964;]</code>, where <code>&#955; = u + v&#964;</code>
		* and <code>u</code> and <code>u</code> are real numbers (elements of
		* <code><b>R</b></code>). 
		* @param mu The parameter <code>&#956;</code> of the elliptic curve.
		* @param u The real part of the element <code>&#955;</code> of
		* <code><b>R</b>[&#964;]</code>.
		* @param v The <code>&#964;</code>-adic part of the element
		* <code>&#955;</code> of <code><b>R</b>[&#964;]</code>.
		* @return The norm of <code>&#955;</code>.
		*/
		public static SimpleBigDecimal Norm(sbyte mu, SimpleBigDecimal u, SimpleBigDecimal v)
		{
			SimpleBigDecimal norm;

			// s1 = u^2
			SimpleBigDecimal s1 = u.Multiply(u);

			// s2 = u * v
			SimpleBigDecimal s2 = u.Multiply(v);

			// s3 = 2 * v^2
			SimpleBigDecimal s3 = v.Multiply(v).ShiftLeft(1);

			if (mu == 1)
			{
				norm = s1.Add(s2).Add(s3);
			}
			else if (mu == -1)
			{
				norm = s1.Subtract(s2).Add(s3);
			}
			else
			{
				throw new ArgumentException("mu must be 1 or -1");
			}

			return norm;
		}
Пример #15
0
		public SimpleBigDecimal Divide(SimpleBigDecimal b)
		{
			CheckScale(b);
			BigInteger dividend = bigInt.ShiftLeft(scale);
			return new SimpleBigDecimal(dividend.Divide(b.bigInt), scale);
		}
Пример #16
0
		/**
		* Rounds an element <code>&#955;</code> of <code><b>R</b>[&#964;]</code>
		* to an element of <code><b>Z</b>[&#964;]</code>, such that their difference
		* has minimal norm. <code>&#955;</code> is given as
		* <code>&#955; = &#955;<sub>0</sub> + &#955;<sub>1</sub>&#964;</code>.
		* @param lambda0 The component <code>&#955;<sub>0</sub></code>.
		* @param lambda1 The component <code>&#955;<sub>1</sub></code>.
		* @param mu The parameter <code>&#956;</code> of the elliptic curve. Must
		* equal 1 or -1.
		* @return The rounded element of <code><b>Z</b>[&#964;]</code>.
		* @throws ArgumentException if <code>lambda0</code> and
		* <code>lambda1</code> do not have same scale.
		*/
		public static ZTauElement Round(SimpleBigDecimal lambda0,
			SimpleBigDecimal lambda1, sbyte mu)
		{
			int scale = lambda0.Scale;
			if (lambda1.Scale != scale)
				throw new ArgumentException("lambda0 and lambda1 do not have same scale");

			if (!((mu == 1) || (mu == -1)))
				throw new ArgumentException("mu must be 1 or -1");

			BigInteger f0 = lambda0.Round();
			BigInteger f1 = lambda1.Round();

			SimpleBigDecimal eta0 = lambda0.Subtract(f0);
			SimpleBigDecimal eta1 = lambda1.Subtract(f1);

			// eta = 2*eta0 + mu*eta1
			SimpleBigDecimal eta = eta0.Add(eta0);
			if (mu == 1)
			{
				eta = eta.Add(eta1);
			}
			else
			{
				// mu == -1
				eta = eta.Subtract(eta1);
			}

			// check1 = eta0 - 3*mu*eta1
			// check2 = eta0 + 4*mu*eta1
			SimpleBigDecimal threeEta1 = eta1.Add(eta1).Add(eta1);
			SimpleBigDecimal fourEta1 = threeEta1.Add(eta1);
			SimpleBigDecimal check1;
			SimpleBigDecimal check2;
			if (mu == 1)
			{
				check1 = eta0.Subtract(threeEta1);
				check2 = eta0.Add(fourEta1);
			}
			else
			{
				// mu == -1
				check1 = eta0.Add(threeEta1);
				check2 = eta0.Subtract(fourEta1);
			}

			sbyte h0 = 0;
			sbyte h1 = 0;

			// if eta >= 1
			if (eta.CompareTo(BigInteger.One) >= 0)
			{
				if (check1.CompareTo(MinusOne) < 0)
				{
					h1 = mu;
				}
				else
				{
					h0 = 1;
				}
			}
			else
			{
				// eta < 1
				if (check2.CompareTo(BigInteger.Two) >= 0)
				{
					h1 = mu;
				}
			}

			// if eta < -1
			if (eta.CompareTo(MinusOne) < 0)
			{
				if (check1.CompareTo(BigInteger.One) >= 0)
				{
					h1 = (sbyte)-mu;
				}
				else
				{
					h0 = -1;
				}
			}
			else
			{
				// eta >= -1
				if (check2.CompareTo(MinusTwo) < 0)
				{
					h1 = (sbyte)-mu;
				}
			}

			BigInteger q0 = f0.Add(BigInteger.ValueOf(h0));
			BigInteger q1 = f1.Add(BigInteger.ValueOf(h1));
			return new ZTauElement(q0, q1);
		}
Пример #17
0
        /**
         * Rounds an element <code>&#955;</code> of <code><b>R</b>[&#964;]</code>
         * to an element of <code><b>Z</b>[&#964;]</code>, such that their difference
         * has minimal norm. <code>&#955;</code> is given as
         * <code>&#955; = &#955;<sub>0</sub> + &#955;<sub>1</sub>&#964;</code>.
         * @param lambda0 The component <code>&#955;<sub>0</sub></code>.
         * @param lambda1 The component <code>&#955;<sub>1</sub></code>.
         * @param mu The parameter <code>&#956;</code> of the elliptic curve. Must
         * equal 1 or -1.
         * @return The rounded element of <code><b>Z</b>[&#964;]</code>.
         * @throws ArgumentException if <code>lambda0</code> and
         * <code>lambda1</code> do not have same scale.
         */
        public static ZTauElement Round(SimpleBigDecimal lambda0,
                                        SimpleBigDecimal lambda1, sbyte mu)
        {
            int scale = lambda0.Scale;

            if (lambda1.Scale != scale)
            {
                throw new ArgumentException("lambda0 and lambda1 do not have same scale");
            }

            if (!((mu == 1) || (mu == -1)))
            {
                throw new ArgumentException("mu must be 1 or -1");
            }

            BigInteger f0 = lambda0.Round();
            BigInteger f1 = lambda1.Round();

            SimpleBigDecimal eta0 = lambda0.Subtract(f0);
            SimpleBigDecimal eta1 = lambda1.Subtract(f1);

            // eta = 2*eta0 + mu*eta1
            SimpleBigDecimal eta = eta0.Add(eta0);

            if (mu == 1)
            {
                eta = eta.Add(eta1);
            }
            else
            {
                // mu == -1
                eta = eta.Subtract(eta1);
            }

            // check1 = eta0 - 3*mu*eta1
            // check2 = eta0 + 4*mu*eta1
            SimpleBigDecimal threeEta1 = eta1.Add(eta1).Add(eta1);
            SimpleBigDecimal fourEta1  = threeEta1.Add(eta1);
            SimpleBigDecimal check1;
            SimpleBigDecimal check2;

            if (mu == 1)
            {
                check1 = eta0.Subtract(threeEta1);
                check2 = eta0.Add(fourEta1);
            }
            else
            {
                // mu == -1
                check1 = eta0.Add(threeEta1);
                check2 = eta0.Subtract(fourEta1);
            }

            sbyte h0 = 0;
            sbyte h1 = 0;

            // if eta >= 1
            if (eta.CompareTo(BigInteger.One) >= 0)
            {
                if (check1.CompareTo(MinusOne) < 0)
                {
                    h1 = mu;
                }
                else
                {
                    h0 = 1;
                }
            }
            else
            {
                // eta < 1
                if (check2.CompareTo(BigInteger.Two) >= 0)
                {
                    h1 = mu;
                }
            }

            // if eta < -1
            if (eta.CompareTo(MinusOne) < 0)
            {
                if (check1.CompareTo(BigInteger.One) >= 0)
                {
                    h1 = (sbyte)-mu;
                }
                else
                {
                    h0 = -1;
                }
            }
            else
            {
                // eta >= -1
                if (check2.CompareTo(MinusTwo) < 0)
                {
                    h1 = (sbyte)-mu;
                }
            }

            BigInteger q0 = f0.Add(BigInteger.ValueOf(h0));
            BigInteger q1 = f1.Add(BigInteger.ValueOf(h1));

            return(new ZTauElement(q0, q1));
        }