Пример #1
0
        public static RNS MrsToRns(MRS mrs)
        {
            RNS rns = new RNS();
            int k   = RNS.fractionalModulusCount + 1;

            int value = mrs.Values[k - 1];

            for (int i = k; i < RNS.Modulus.Length; i++)
            {
                int tempValue = mrs.Values[i];

                for (int j = k; j <= i; j++)
                {
                    tempValue *= RNS.Modulus[j - 1];
                }

                value += tempValue;
            }

            var rnsValue = new int[RNS.Modulus.Length];

            for (int i = 0; i < RNS.Modulus.Length; i++)
            {
                rnsValue[i] = value % RNS.Modulus[i];
            }

            rns.Values = rnsValue;
            return(rns);
        }
Пример #2
0
        static void Main(string[] args)
        {
            Console.WriteLine("Wprowadź liczbę X:");
            double x = double.Parse(Console.ReadLine());

            Console.WriteLine("Wprowadź liczbę Y:");
            double y = double.Parse(Console.ReadLine());

            RNS rnsX = MathRNS.ConvertToRNS(x);

            Print(rnsX);
            RNS rnsY = MathRNS.ConvertToRNS(y);

            Print(rnsY);

            RNS zpi = MathRNS.Mult(rnsX, rnsY);

            Console.WriteLine("Wynik pośredni:");
            Print(zpi);

            MRS mrs = MathRNS.RnsToMrs(zpi);

            RNS result = MathRNS.MrsToRns(mrs);

            Console.WriteLine("Wynik właściwy:");
            Print(result);
        }
Пример #3
0
 static void Print(RNS x)
 {
     Console.WriteLine();
     Console.WriteLine("Moduły: ");
     for (int i = 0; i < x.Values.Length; i++)
     {
         Console.Write(RNS.Modulus[i] + " ");
     }
     Console.WriteLine();
     Console.WriteLine("Reszty: ");
     for (int i = 0; i < x.Values.Length; i++)
     {
         Console.Write(x.Values[i] + " ");
     }
     Console.WriteLine();
 }
Пример #4
0
        public static RNS Mult(RNS rnsX, RNS rnsY)
        {
            RNS zpi = new RNS();

            int machineValueZpi = rnsX.MachineValue * rnsY.MachineValue;

            zpi.MachineValue = machineValueZpi;

            zpi.Values = new int[RNS.Modulus.Length];

            for (int i = 0; i < RNS.Modulus.Length; i++)
            {
                zpi.Values[i] = rnsX.Values[i] * rnsY.Values[i] % RNS.Modulus[i];
            }

            return(zpi);
        }
Пример #5
0
        public static RNS ConvertToRNS(double number)
        {
            RNS rns          = new RNS();
            int Rf           = RNS.CalculateFractionalRange();
            int machineValue = CalculateMachineValue(number, Rf);

            var values = new int[RNS.ModulusCount];

            for (int i = 0; i < RNS.ModulusCount; i++)
            {
                values[i] = machineValue % RNS.Modulus[i];
            }

            rns.Values       = values;
            rns.MachineValue = machineValue;

            return(rns);
        }
Пример #6
0
        public static MRS RnsToMrs(RNS rns)
        {
            MRS mrs    = new MRS();
            var zdigit = new int[RNS.Modulus.Length];

            zdigit[0] = rns.Values[0];
            int temp = 0;

            for (int i = 1; i < RNS.ModulusCount; i++)
            {
                temp = ModInverse(RNS.Modulus[0], RNS.Modulus[i]) * (rns.Values[i] - zdigit[0]);

                for (int j = 1; j <= i; j++)
                {
                    temp = ModInverse(RNS.Modulus[j], RNS.Modulus[i]) * (temp - zdigit[j]);
                }

                zdigit[i] = temp % RNS.Modulus[i];
            }
            mrs.Values  = zdigit;
            mrs.Modulus = RNS.Modulus;

            return(mrs);
        }