source: trunk/CrypPlugins/PKCS1/Library/MathFunctions.cs @ 1778

Last change on this file since 1778 was 1778, checked in by schomburg, 11 years ago

renamed some classes for the sake of consistency

File size: 4.2 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using Org.BouncyCastle.Math;
6
7//using Emil.GMP;
8
9namespace PKCS1.Library
10{
11    class MathFunctions
12    {
13        // Heron Algorithmus
14        static public BigInteger cuberoot(BigInteger radicant)
15        {
16            int i = 0;
17            BigInteger biStart = BigInteger.ValueOf(1000);
18            BigInteger biFix2 = BigInteger.Two;
19            BigInteger biFix3 = BigInteger.Three;
20            BigInteger biFromBevor = BigInteger.Zero;
21
22            while (!biStart.Equals(biFromBevor))
23            {
24                biFromBevor = biStart;
25                // (2 * biStart + (x/ biStart^2)) / 3
26                biStart = biFix2.Multiply(biStart).Add(radicant.Divide(biStart.Pow(2))).Divide(biFix3);
27                i++;
28            }
29            return biStart;
30        }
31
32        static public bool compareBigInt(BigInteger value1, BigInteger value2, int length)
33        {
34            byte[] array1 = value1.ToByteArray();
35            byte[] array2 = value2.ToByteArray();
36
37            return compareByteArray(ref array1, ref array2, length);
38        }
39
40        static public bool compareByteArray(ref byte[] array1, ref byte[] array2, int length)
41        {
42            for (int i = length - 1; i > 0; i--)
43            {
44                if (array1[i] != array2[i])
45                {
46                    return false;
47                }
48            }
49            return true;
50        }
51
52        static public BigInteger cuberoot4(BigInteger BigIntRad, int prec)
53        {
54            //BigInteger x;                    // ZZ: Langzahl-Integer
55            MyFloat a = new MyFloat();
56            MyFloat xi = new MyFloat();
57            MyFloat x3 = new MyFloat();
58            MyFloat two = new MyFloat(); // RR: Gleitkommazahlen beliebiger Präzision
59            MyFloat three = new MyFloat(); // RR: Gleitkommazahlen beliebiger Präzision
60
61            MyFloat.setPrec(prec);
62
63            //x = BigIntRad;
64
65            BigInteger BigInt2 = BigInteger.Two;
66            MyFloat.to_Float(ref two, ref BigInt2);
67
68            BigInteger BigInt3 = BigInteger.Three;
69            MyFloat.to_Float(ref three, ref BigInt3);
70
71            // 1. Startwert für die Approximation berechnen (mit double)
72            //appr_cr_x = exp( 1.0/3.0 * log(x) ); 
73           
74
75            // 2. Startwert (xi) und Ausgangswert (a=x) in Gleitkommazahl mit hoher Präzision überführen
76            //a  = to_RR(x);
77            MyFloat.to_Float(ref a, ref BigIntRad);
78
79            MyFloat tmp = new MyFloat();
80            BigInteger tmp2 = BigInteger.ValueOf(BigIntRad.BitLength);
81            MyFloat.to_Float(ref tmp,ref tmp2);
82            //xi = to_RR(appr_cr_x);
83            //xi = new MyFloat(appr_cr_x);
84            //MyFloat.div(ref xi, ref a,ref tmp);
85            BigInteger start = BigIntRad.ShiftRight(BigIntRad.BitLength * 2 / 3);
86            MyFloat.to_Float(ref xi, ref start);
87
88
89            // 3. Halley's konvergierende Folge (x[i+1] = xi*(xi^3 + 2*a)/(2*xi^3 + a) --> x^(1/3)) mit 200 Iterationen -- *nicht optimiert*
90            //two = to_RR(2.0);
91            //two = new MyFloat(2.0);
92
93            for ( int i = 0; i<200; i++ )
94            {
95                //x3 = xi*xi*xi;
96                MyFloat.mul(ref x3, ref xi, ref xi);
97                MyFloat.mul(ref x3, ref x3, ref xi);
98                //xi = (xi*(x3 + two * a)) / ( two * x3 + a );
99               
100                //xi = xi*( (x3 + two * a) / ( two * x3 +a ) );
101                MyFloat twoA = new MyFloat();
102                MyFloat.mul(ref twoA, ref two, ref a);
103
104                MyFloat left = new MyFloat();
105                MyFloat.add(ref left, ref x3, ref twoA);
106               
107
108                MyFloat twoX3 = new MyFloat();
109                MyFloat.mul(ref twoX3, ref two, ref x3);
110
111                MyFloat right = new MyFloat();
112                MyFloat.add(ref right, ref twoX3, ref a);
113
114                MyFloat division = new MyFloat();
115                MyFloat.div(ref division, ref left, ref right);
116
117                MyFloat.mul(ref xi, ref xi, ref division);
118            }
119
120            return MyFloat.to_ZZ(ref xi);
121        }
122    }
123}
Note: See TracBrowser for help on using the repository browser.