private Double dilutionRate = 1;    // ml/sec

        public CultureSimulator(TurbidoAlgorithmLibrary _library)
        {
            library              = _library;
            lastTime             = new DoubleRef();
            lastOD               = new DoubleArrayRef(numberOfCultures);
            GrowthTimer          = new System.Timers.Timer(dataPointPeriod * 1000);
            GrowthTimer.Elapsed += this.GrowthTick;

            var rng = new CryptoRandomSource();

            // initialize cultures
            for (int i = 0; i < 4; i++)
            {
                if (culture_set == 'A')
                {
                    lastOD.values[i]     = rng.NextDouble() * initialOD;
                    lastOD.values[8 + i] = rng.NextDouble() * initialOD;
                    lastOD.values[4 + i] = lastOD.values[12 + i] = 0;
                }
                else
                {
                    lastOD.values[4 + i]  = rng.NextDouble() * initialOD;
                    lastOD.values[12 + i] = rng.NextDouble() * initialOD;
                    lastOD.values[i]      = lastOD.values[8 + i] = 0;
                }
            }
        }
예제 #2
0
        private double GenerateRandom()
        {
            CryptoRandomSource random = new CryptoRandomSource();
            double             value  = random.NextDouble();
            bool negate = random.NextBoolean();

            return(negate ? -value : value);
        }
예제 #3
0
        public void CryptoRandomSource_32ByteResults()
        {
            var source = new CryptoRandomSource(32);
            var result = source.GetEntropyAsync(EntropyPriority.Normal).GetAwaiter().GetResult();

            Assert.AreEqual(result.Length, 32);
            Assert.IsFalse(result.All(b => b == 0));
        }
예제 #4
0
        private void CreateNew()
        {
            Size s = GetRenderSize();

            if (Double.TryParse(MeanTb.Text, out double m1) && Double.TryParse(StdDevTb.Text, out double m2) && SwitchTryParse(DefaultToTb.Text, out Switch m3))
            {
                CryptoRandomSource r    = new CryptoRandomSource();
                Normal             n    = new Normal(m1, m2);
                double[]           samp = new double[s.Width * s.Height];
                n.Samples(samp);
                samp = samp.OrderBy(x => r.Next()).ToArray();
                Cur  = Voxel.GenerateVoxels(s.Width, s.Height, samp, externalWeights, wt, GetChoiceType(), m3);
            }
            else
            {
                MessageBox.Show("Render failed: inappropriate text for weights.");
            }
        }
예제 #5
0
        static public int TestMethod(int totalLength, int sampleLength)
        {
            //初始化部分,zeroOneMeasure是个MeasureMatrixH类型,里面有两个元素{1 0;0 0}, {0 0;0 1}
            //plusminusMeasure是个MeasureMatrixH类型,里面有两个元素{1/2 1/2;1/2 1/2}, {1/2 -1/2;-1/2 1/2}
            var matrixArray0 = new Matrix[2];

            Complex[,] array0 =
            {
                { 1, 0 },
                { 0, 0 }
            };
            matrixArray0[0]   = (Matrix)Matrix.Build.DenseOfArray(array0);
            Complex[,] array1 =
            {
                { 0, 0 },
                { 0, 1 }
            };
            matrixArray0[1] = (Matrix)Matrix.Build.DenseOfArray(array1);
            var zeroOneMeasure = new MeasureMatrixH(matrixArray0);
            var matrixArray1   = new Matrix[2];

            Complex[,] array2 =
            {
                { 0.5, 0.5 },
                { 0.5, 0.5 }
            };
            matrixArray1[0]   = (Matrix)Matrix.Build.DenseOfArray(array2);
            Complex[,] array3 =
            {
                {  0.5, -0.5 },
                { -0.5,  0.5 }
            };
            matrixArray1[1] = (Matrix)Matrix.Build.DenseOfArray(array3);
            var plusminusMeasure = new MeasureMatrixH(matrixArray1);


            //-------------Alice----------------------
            //Debug Console.Write("Input Array Length:");
            //Debug var arrayLengthStr = Console.ReadLine();


            int arrayLength = totalLength;


            //-------------------------check length----------------

            int checkLengthPercent = sampleLength;



            var RandomGen = new CryptoRandomSource();
            //生成一个rawKeyArray[10],是bool数组类型,每一个item,从0,1这两个中选择
            //Produce raw key array 0,1
            var rawKeyArray = new byte[arrayLength];

            //生成一个basisRawArray[10],是bool数组类型,每一个item,从0,1这两个中选择
            //0表示0,1基,1表示{+,-}基
            var basisRawArray = new byte[arrayLength];

            //生成一个ketEncArray[10]是ket数组类型.每一位由rawKeyArray和basisRawArray共同决定。
            //if basisRawArray里面的值是0,rawKeyArray里面的值是0,则 ketEncArray里面的值是ket(0)
            //if basisRawArray里面的值是0,rawKeyArray里面的值是1,则 ketEncArray里面的值是ket(1)
            // if basisRawArray里面的值是1,rawKeyArray里面的值是0,则 ketEncArray里面的值是ket(1/Sqrt(2),1/Sqrt(2))
            // if basisRawArray里面的值是1,rawKeyArray里面的值是1,则 ketEncArray里面的值是ket(1/Sqrt(2),-1/Sqrt(2))
            var ketEncArray  = new Ket[arrayLength];
            var complexArray = new Complex[2];

            for (var i = 0; i < arrayLength; i++)
            {
                rawKeyArray[i]   = (byte)RandomGen.Next(2);
                basisRawArray[i] = (byte)RandomGen.Next(2);
                if (basisRawArray[i] == 0 && rawKeyArray[i] == 0)
                {
                    complexArray[0] = new Complex(1, 0);
                    complexArray[1] = new Complex(0, 0);
                    ketEncArray[i]  = new Ket(complexArray);
                }
                else if (basisRawArray[i] == 0 && rawKeyArray[i] == 1)
                {
                    complexArray[0] = new Complex(0, 0);
                    complexArray[1] = new Complex(1, 0);
                    ketEncArray[i]  = new Ket(complexArray);
                }
                else if (basisRawArray[i] == 1 && rawKeyArray[i] == 0)
                {
                    complexArray[0] = new Complex(1 / Sqrt(2), 0);
                    complexArray[1] = new Complex(1 / Sqrt(2), 0);
                    ketEncArray[i]  = new Ket(complexArray);
                }
                else if (basisRawArray[i] == 1 && rawKeyArray[i] == 1)
                {
                    complexArray[0] = new Complex(1 / Sqrt(2), 0);
                    complexArray[1] = new Complex(-1 / Sqrt(2), 0);
                    ketEncArray[i]  = new Ket(complexArray);
                }
            }

            // -----------alice end---------------------

            ////--------------Quantum Channel begins, ignoring EVE ----------

            var densityopEncArray = new DensityOperator[arrayLength];

            for (var i = 0; i < arrayLength; i++)
            {
                densityopEncArray[i] = new DensityOperator(ketEncArray[i], new Bra(ketEncArray[i]));
            }
            QuantumChannelProcess(densityopEncArray);


            //---------------Quantum Channel End-------Eve end---------------------

            //---------------------Bob begin--------------------
            //Bob 生成一个measureRawArray,是bool数组类型随机{0,1}------------
            var measureRawArray = new byte[arrayLength];


            //生成结果数组 resultMeasureArray,是bool数组类型,其中的值由  measureRawArray和 densityopEncArray共同决定
            // foreach item in densityopEncArray
            //if measureRawArray[index]=0则用 zeroOneMeasure 作为调用的参数传递到    densityopEncArray的本位,ket[index].MeasuHResultIndex(zeroOneMeasure )
            //if measureRawArray[index]=1则用 plusminusMeasure 作为调用的参数传递到 densityopEncArray的本位,ket[index].MeasuHResultIndex(plusminusMeasure )
            var resultMeasureArray = new byte[arrayLength];

            for (var i = 0; i < arrayLength; i++)
            {
                measureRawArray[i] = (byte)RandomGen.Next(2);
                if (measureRawArray[i] == 0)
                {
                    if (densityopEncArray[i].MeasuHResultIndex(zeroOneMeasure) != 0)
                    {
                        resultMeasureArray[i] = 1;
                    }
                }
                else
                {
                    if (densityopEncArray[i].MeasuHResultIndex(plusminusMeasure) != 0)
                    {
                        resultMeasureArray[i] = 1;
                    }
                }
            }


            // ---------------------Bob end--------------------


            //--------------公共信道广播不做--------


            //--------------公共信道结束----------



            // --------------ALice begin---------------
            //生成应答数组,correctBroadArray,bool数组类型。
            //foreach item in measureRawArray
            //if measureRawArray[index]== basisRawArray[index], correctBroadArray[index]==1. else correctBroadArray[index]==0
            var correctBroadArray = new byte[arrayLength];

            for (var i = 0; i < arrayLength; i++)
            {
                if (measureRawArray[i] == basisRawArray[i])
                {
                    correctBroadArray[i] = 1;
                }
            }


            // 生成finalAliceKey数组是bool数组类型,
            // foreach item in  correctBroadArray
            // if correctBroadArray[index]==1 , push(rawKeyArray[index]),即把  correctBroadArray[index]==1的那些位置的  rawKeyArray[index]取出来放一起finalAliceKey。
            var finalAliceKeyList = new List <byte>();

            for (var i = 0; i < arrayLength; i++)
            {
                if (correctBroadArray[i] != 0)
                {
                    finalAliceKeyList.Add(rawKeyArray[i]);
                }
            }
            var finalAliceKey = finalAliceKeyList.ToArray();

            //------------Alice end--------------------


            //------------公共信道开始-----------------------
            //-----------公共信道结束------------------------

            //--------------Bob开始-------------------------
            //生成finalBobKey数组是bool数组类型
            // foreach item in  correctBroadArray
            // if correctBroadArray[index]==1 , push(resultMeasureArray[index]),即把  correctBroadArray[index]==1的那些位置的  resultMeasureArray[index]取出来放一起存到finalBobKey。
            var finalBobKeyList = new List <byte>();

            for (var i = 0; i < arrayLength; i++)
            {
                if (correctBroadArray[i] != 0)
                {
                    finalBobKeyList.Add(resultMeasureArray[i]);
                }
            }
            var finalBobKey = finalBobKeyList.ToArray();

            //----------------Bob结束----------------------


            //Check start
            //Check the alice and bob's length is equal
            var check = true;

            if (finalAliceKey.Length != finalBobKey.Length)
            {
                check = false;
            }
            if (check)
            {
                // Console.WriteLine("Length: Success");
            }
            else
            {
                //Console.WriteLine("Length: Failed");
            }

            //Sampling start
            var samplingLength = (checkLengthPercent * finalAliceKey.Length) / 100;
            //Console.WriteLine($"Sampling {samplingLength} bits");
            var samplingAliceKey       = new List <byte>(finalAliceKey);
            var samplingBobKey         = new List <byte>(finalBobKey);
            var samplingAliceKeySample = new List <byte>();
            var samplingBobKeySample   = new List <byte>();

            for (var i = 0; i < samplingLength; i++)
            {
                var position = RandomGen.Next(samplingAliceKey.Count);  //shuffle here, sample from agreement key and then delete it
                samplingAliceKeySample.Add(samplingAliceKey[position]);
                samplingAliceKey.RemoveAt(position);
                samplingBobKeySample.Add(samplingBobKey[position]);
                samplingBobKey.RemoveAt(position);
            }
            for (var i = 0; i < samplingLength; i++)
            {
                if (samplingAliceKeySample[i] != samplingBobKeySample[i])
                {
                    check = false;
                }
            }

            if (check)
            {
                //Console.WriteLine("Sampling process: Success");
                return(1); //Add success times here
            }
            else
            {
                //Console.WriteLine("Sampling process: Failed");
                return(0);
            }
        }
        /// <summary>
        /// Executes the example.
        /// </summary>
        /// <seealso cref="http://en.wikipedia.org/wiki/Random_number_generation">Random number generation</seealso>
        /// <seealso cref="http://en.wikipedia.org/wiki/Linear_congruential_generator">Linear congruential generator</seealso>
        /// <seealso cref="http://en.wikipedia.org/wiki/Mersenne_twister">Mersenne twister</seealso>
        /// <seealso cref="http://en.wikipedia.org/wiki/Lagged_Fibonacci_generator">Lagged Fibonacci generator</seealso>
        /// <seealso cref="http://en.wikipedia.org/wiki/Xorshift">Xorshift</seealso>
        public override void ExecuteExample()
        {
            // All RNG classes in MathNet have the following counstructors:
            // - RNG(int seed, bool threadSafe): initializes a new instance using a specific seed value and thread
            //   safe property
            // - RNG(int seed): initializes a new instance using a specific seed value. Thread safe property is set
            //   to Control.ThreadSafeRandomNumberGenerators
            // - RNG(bool threadSafe) : initializes a new instance with the seed value set to DateTime.Now.Ticks and
            //   specific thread safe property
            // - RNG(bool threadSafe) : initializes a new instance with the seed value set to DateTime.Now.Ticks and
            //   thread safe property set to Control.ThreadSafeRandomNumberGenerators

            // All RNG classes in MathNet have next methods to produce random values:
            // - double[] NextDouble(int n): returns an "n"-size array of uniformly distributed random doubles in
            //   the interval [0.0,1.0];
            // - int Next(): returns a nonnegative random number;
            // - int Next(int maxValue): returns a random number less then a specified maximum;
            // - int Next(int minValue, int maxValue): returns a random number within a specified range;
            // - void NextBytes(byte[] buffer): fills the elements of a specified array of bytes with random numbers;

            // All RNG classes in MathNet have next extension methods to produce random values:
            // - long NextInt64(): returns a nonnegative random number less than "Int64.MaxValue";
            // - int NextFullRangeInt32(): returns a random number of the full Int32 range;
            // - long NextFullRangeInt64(): returns a random number of the full Int64 range;
            // - decimal NextDecimal(): returns a nonnegative decimal floating point random number less than 1.0;

            // 1. Multiplicative congruential generator using a modulus of 2^31-1 and a multiplier of 1132489760
            var mcg31M1 = new Mcg31m1(1);

            MathDisplay.WriteLine(@"1. Generate 10 random double values using Multiplicative congruential generator with a 
      modulus of 2^31-1 and a multiplier of 1132489760");
            var randomValues = mcg31M1.NextDoubles(10);

            for (var i = 0; i < randomValues.Length; i++)
            {
                MathDisplay.Write(randomValues[i].ToString("N") + @" ");
            }
            MathDisplay.FlushBuffer();

            MathDisplay.WriteLine();
            MathDisplay.WriteLine();

            // 2. Multiplicative congruential generator using a modulus of 2^59 and a multiplier of 13^13
            var mcg59 = new Mcg59(1);

            MathDisplay.WriteLine(@"2. Generate 10 random integer values using Multiplicative congruential generator with a 
      modulus of 2^59 and a multiplier of 13^13");
            for (var i = 0; i < 10; i++)
            {
                MathDisplay.Write(mcg59.Next() + @" ");
            }
            MathDisplay.FlushBuffer();

            MathDisplay.WriteLine();
            MathDisplay.WriteLine();

            // 3. Random number generator using Mersenne Twister 19937 algorithm
            var mersenneTwister = new MersenneTwister(1);

            MathDisplay.WriteLine(@"3. Generate 10 random integer values less then 100 using Mersenne Twister 19937 algorithm");
            for (var i = 0; i < 10; i++)
            {
                MathDisplay.Write(mersenneTwister.Next(100) + @" ");
            }
            MathDisplay.FlushBuffer();

            MathDisplay.WriteLine();
            MathDisplay.WriteLine();

            // 4. Multiple recursive generator with 2 components of order 3
            var mrg32K3A = new Mrg32k3a(1);

            MathDisplay.WriteLine(@"4. Generate 10 random integer values in range [50;100] using multiple recursive generator 
      with 2 components of order 3");
            for (var i = 0; i < 10; i++)
            {
                MathDisplay.Write(mrg32K3A.Next(50, 100) + @" ");
            }
            MathDisplay.FlushBuffer();

            MathDisplay.WriteLine();
            MathDisplay.WriteLine();

            // 5. Parallel Additive Lagged Fibonacci pseudo-random number generator
            var palf = new Palf(1);

            MathDisplay.WriteLine(@"5. Generate 10 random bytes using Parallel Additive Lagged Fibonacci pseudo-random number 
      generator");
            var bytes = new byte[10];

            palf.NextBytes(bytes);
            for (var i = 0; i < bytes.Length; i++)
            {
                MathDisplay.Write(bytes[i] + @" ");
            }
            MathDisplay.FlushBuffer();

            MathDisplay.WriteLine();
            MathDisplay.WriteLine();

            // 6. A random number generator based on "System.Security.Cryptography.RandomNumberGenerator" class in
            //    the .NET library
            var systemCrypto = new CryptoRandomSource();

            MathDisplay.WriteLine(@"6. Generate 10 random decimal values using RNG based on 
      'System.Security.Cryptography.RandomNumberGenerator'");
            for (var i = 0; i < 10; i++)
            {
                MathDisplay.Write(systemCrypto.NextDecimal().ToString("N") + @" ");
            }

            MathDisplay.WriteLine();
            MathDisplay.WriteLine();

            // 7. Wichmann-Hill’s 1982 combined multiplicative congruential generator
            var rngWh1982 = new WH1982();

            MathDisplay.WriteLine(@"7. Generate 10 random full Int32 range values using Wichmann-Hill’s 1982 combined 
      multiplicative congruential generator");
            for (var i = 0; i < 10; i++)
            {
                MathDisplay.Write(rngWh1982.NextFullRangeInt32() + @" ");
            }
            MathDisplay.FlushBuffer();

            MathDisplay.WriteLine();
            MathDisplay.WriteLine();

            // 8. Wichmann-Hill’s 2006 combined multiplicative congruential generator.
            var rngWh2006 = new WH2006();

            MathDisplay.WriteLine(@"8. Generate 10 random full Int64 range values using Wichmann-Hill’s 2006 combined 
      multiplicative congruential generator");
            for (var i = 0; i < 10; i++)
            {
                MathDisplay.Write(rngWh2006.NextFullRangeInt32() + @" ");
            }
            MathDisplay.FlushBuffer();

            MathDisplay.WriteLine();
            MathDisplay.WriteLine();

            // 9. Multiply-with-carry Xorshift pseudo random number generator
            var xorshift = new Xorshift();

            MathDisplay.WriteLine(@"9. Generate 10 random nonnegative values less than Int64.MaxValue using 
      Multiply-with-carry Xorshift pseudo random number generator");
            for (var i = 0; i < 10; i++)
            {
                MathDisplay.Write(xorshift.NextInt64() + @" ");
            }
            MathDisplay.FlushBuffer();

            MathDisplay.WriteLine();
        }
예제 #7
0
        static public void TestMethod()
        {
            //Initilization,zeroOneMeasureis a MeasureMatrixH class. {1 0;0 0}, {0 0;0 1}
            //plusminusMeasure is MeasureMatrixH class,{1/2 1/2;1/2 1/2}, {1/2 -1/2;-1/2 1/2}
            var matrixArray0 = new Matrix[2];

            Complex[,] array0 =
            {
                { 1, 0 },
                { 0, 0 }
            };
            matrixArray0[0]   = (Matrix)Matrix.Build.DenseOfArray(array0);
            Complex[,] array1 =
            {
                { 0, 0 },
                { 0, 1 }
            };
            matrixArray0[1] = (Matrix)Matrix.Build.DenseOfArray(array1);
            var zeroOneMeasure = new MeasureMatrixH(matrixArray0);
            var matrixArray1   = new Matrix[2];

            Complex[,] array2 =
            {
                { 0.5, 0.5 },
                { 0.5, 0.5 }
            };
            matrixArray1[0]   = (Matrix)Matrix.Build.DenseOfArray(array2);
            Complex[,] array3 =
            {
                {  0.5, -0.5 },
                { -0.5,  0.5 }
            };
            matrixArray1[1] = (Matrix)Matrix.Build.DenseOfArray(array3);
            var plusminusMeasure = new MeasureMatrixH(matrixArray1);


            //-------------Alice----------------------
            Console.Write("Input Array Length:");
            var arrayLengthStr = Console.ReadLine();
            int arrayLength;

            if (!int.TryParse(arrayLengthStr, out arrayLength))
            {
                Console.WriteLine("Must input integer, use default(10)");
                arrayLength = 10;
            }
            var RandomGen = new CryptoRandomSource();

            //Produce raw key array 0,1
            var rawKeyArray = new byte[arrayLength];


            //0 is {|0>,|1>},1 is {|+>,|->} basis.
            var basisRawArray = new byte[arrayLength];

            //Every KetEncArray is decided by rawKeyArray and basisRawArray
            //if basisRawArray is 0,rawKeyArray is 0,then ketEncArray is ket(0)
            //if basisRawArray is 0,rawKeyArray is 1,then ketEncArray is ket(1)
            // if basisRawArray is 1,rawKeyArray is 0,then ketEncArray is ket(1/Sqrt(2),1/Sqrt(2))
            // if basisRawArray is 1,rawKeyArray is 1,then ketEncArray ket(1/Sqrt(2),-1/Sqrt(2))
            var ketEncArray  = new Ket[arrayLength];
            var complexArray = new Complex[2];

            for (var i = 0; i < arrayLength; i++)
            {
                rawKeyArray[i]   = (byte)RandomGen.Next(2);
                basisRawArray[i] = (byte)RandomGen.Next(2);
                if (basisRawArray[i] == 0 && rawKeyArray[i] == 0)
                {
                    complexArray[0] = new Complex(1, 0);
                    complexArray[1] = new Complex(0, 0);
                    ketEncArray[i]  = new Ket(complexArray);
                }
                else if (basisRawArray[i] == 0 && rawKeyArray[i] == 1)
                {
                    complexArray[0] = new Complex(0, 0);
                    complexArray[1] = new Complex(1, 0);
                    ketEncArray[i]  = new Ket(complexArray);
                }
                else if (basisRawArray[i] == 1 && rawKeyArray[i] == 0)
                {
                    complexArray[0] = new Complex(1 / Sqrt(2), 0);
                    complexArray[1] = new Complex(1 / Sqrt(2), 0);
                    ketEncArray[i]  = new Ket(complexArray);
                }
                else if (basisRawArray[i] == 1 && rawKeyArray[i] == 1)
                {
                    complexArray[0] = new Complex(1 / Sqrt(2), 0);
                    complexArray[1] = new Complex(-1 / Sqrt(2), 0);
                    ketEncArray[i]  = new Ket(complexArray);
                }
            }

            // -----------alice end---------------------

            ////--------------Quantum Channel begins, ignoring EVE ----------

            var densityopEncArray = new DensityOperator[arrayLength];

            for (var i = 0; i < arrayLength; i++)
            {
                densityopEncArray[i] = new DensityOperator(ketEncArray[i], new Bra(ketEncArray[i]));
            }
            QuantumChannelProcess(densityopEncArray);


            //---------------Quantum Channel End-------Eve end---------------------

            //---------------------Bob begin--------------------
            //Bob produces measureRawArray,randomly {0,1}------------
            var measureRawArray = new byte[arrayLength];


            // resultMeasureArray is bool array. The value is decided by measureRawArray and ketEncArray.
            // foreach item in ketEncArray
            //if measureRawArray[index]=0 then zeroOneMeasure would be transferred to ketEncArray ,ket[index].MeasuHResultIndex(zeroOneMeasure )
            //if measureRawArray[index]=1 then plusminusMeasure would be transferred to ketEncArray,ket[index].MeasuHResultIndex(plusminusMeasure )
            var resultMeasureArray = new byte[arrayLength];

            for (var i = 0; i < arrayLength; i++)
            {
                measureRawArray[i] = (byte)RandomGen.Next(2);
                if (measureRawArray[i] == 0)
                {
                    if (densityopEncArray[i].MeasuHResultIndex(zeroOneMeasure) != 0)
                    {
                        resultMeasureArray[i] = 1;
                    }
                }
                else
                {
                    if (densityopEncArray[i].MeasuHResultIndex(plusminusMeasure) != 0)
                    {
                        resultMeasureArray[i] = 1;
                    }
                }
            }


            // ---------------------Bob end--------------------



            // --------------ALice begin---------------
            //Produce answer array,correctBroadArray,bool array class.
            //foreach item in measureRawArray
            //if measureRawArray[index]== basisRawArray[index], correctBroadArray[index]==1. else correctBroadArray[index]==0
            var correctBroadArray = new byte[arrayLength];

            for (var i = 0; i < arrayLength; i++)
            {
                if (measureRawArray[i] == basisRawArray[i])
                {
                    correctBroadArray[i] = 1;
                }
            }


            // foreach item in  correctBroadArray
            // if correctBroadArray[index]==1 , push(rawKeyArray[index]),i.e.  correctBroadArray[index]==1 position  rawKeyArray[index]is taken out and storage into finalAliceKey.
            var finalAliceKeyList = new List <byte>();

            for (var i = 0; i < arrayLength; i++)
            {
                if (correctBroadArray[i] != 0)
                {
                    finalAliceKeyList.Add(rawKeyArray[i]);
                }
            }
            var finalAliceKey = finalAliceKeyList.ToArray();

            //------------Alice end--------------------



            //--------------Bob begins-------------------------
            //Produce finalBobKey array is bool array
            // foreach item in  correctBroadArray
            // if correctBroadArray[index]==1 , push(resultMeasureArray[index]),i.e.  correctBroadArray[index]==1 position,  resultMeasureArray[index] is taken out and storage into finalBobKey.
            var finalBobKeyList = new List <byte>();

            for (var i = 0; i < arrayLength; i++)
            {
                if (correctBroadArray[i] != 0)
                {
                    finalBobKeyList.Add(resultMeasureArray[i]);
                }
            }
            var finalBobKey = finalBobKeyList.ToArray();

            //----------------Bob END----------------------



            //Check Begin
            //check finalAliceKey is equal to finalBobKey
            bool check = true;

            if (finalAliceKey.Length != finalBobKey.Length)
            {
                check = false;
            }
            for (var i = 0; i < finalAliceKey.Length; i++)
            {
                if (finalAliceKey[i] != finalBobKey[i])
                {
                    check = false;
                }
            }
            //if (check)
            //{
            //    Console.WriteLine("Success");
            //}
            //else
            //{
            //    Console.WriteLine("Failed");
            //}
            ////check end

            Console.WriteLine($"zeroOneMeasure:\n{zeroOneMeasure.Value[0].ToComplexString()}\n{zeroOneMeasure.Value[1].ToComplexString()}");
            Console.WriteLine($"plusMinusMeasure:\n{plusminusMeasure.Value[0].ToComplexString()}\n{plusminusMeasure.Value[1].ToComplexString()}");
            Console.Write("rawKeyArray\t");
            foreach (var b in rawKeyArray)
            {
                Console.Write(b);
            }
            Console.WriteLine();
            Console.Write("basisRawArray\t");
            foreach (var b in basisRawArray)
            {
                Console.Write(b);
            }
            Console.WriteLine();


            Console.WriteLine();

            Console.Write("measureRawArray\t\t");
            foreach (var b in measureRawArray)
            {
                Console.Write(b);
            }
            Console.WriteLine();
            Console.Write("resultMeasureArray\t");
            foreach (var b in resultMeasureArray)
            {
                Console.Write(b);
            }
            Console.WriteLine();
            Console.Write("correctBroadArray\t");
            foreach (var b in correctBroadArray)
            {
                Console.Write(b);
            }
            Console.WriteLine();
            Console.Write("finalAliceKey\t\t");
            foreach (var b in finalAliceKey)
            {
                Console.Write(b);
            }
            Console.WriteLine();
            Console.Write("finalBobKey\t\t");
            foreach (var b in finalBobKey)
            {
                Console.Write(b);
            }
            if (check)
            {
                Console.WriteLine("\nThe protocol: Success");
            }
            else
            {
                Console.WriteLine("\nThe protocol: Failed");
            }
            //check end
            Console.WriteLine();
        }
예제 #8
0
파일: Voxel.cs 프로젝트: snorepion/Bitmath
        public static Voxel[,] GenerateVoxels(int xs, int ys, Double[] weights, Double[,] extrWeights, WeightType[,] extrWeightsType, int ChoiceType, Switch Default = Switch.Indeterminate)
        {
            int x = 0;
            int y = 0;

            Voxel[,] section = new Voxel[xs, ys];
            CryptoRandomSource r = new CryptoRandomSource();
            int x2  = 0;
            int y2  = 0;
            int ind = 0;

            while (y2 < ys)
            {
                while (x2 < xs)
                {
                    section[x2, y2] = new Voxel(weights[ind], Switch.Indeterminate, x2, y2);
                    ++x2;
                    ++ind;
                }
                ++y2;
                x2 = 0;
            }
            Voxel  TopLeft      = new Voxel(0.0, 0.0, 0, 0);
            Voxel  TopCenter    = new Voxel(0.0, 0.0, 0, 0);
            Voxel  TopRight     = new Voxel(0.0, 0.0, 0, 0);
            Voxel  CenterLeft   = new Voxel(0.0, 0.0, 0, 0);
            Voxel  CenterRight  = new Voxel(0.0, 0.0, 0, 0);
            Voxel  BottomLeft   = new Voxel(0.0, 0.0, 0, 0);
            Voxel  BottomCenter = new Voxel(0.0, 0.0, 0, 0);
            Voxel  BottomRight  = new Voxel(0.0, 0.0, 0, 0);
            double d            = 0;

            while (y < ys)
            {
                while (x < xs)
                {
                    if (x > 0)
                    {
                        CenterLeft = section[x - 1, y];
                        if (y > 0)
                        {
                            TopLeft = section[x - 1, y - 1];
                        }
                        if (y < ys - 1)
                        {
                            BottomLeft = section[x - 1, y + 1];
                        }
                    }
                    if (x < xs - 1)
                    {
                        CenterRight = section[x + 1, y];
                        if (y > 0)
                        {
                            TopRight = section[x + 1, y - 1];
                        }
                        if (y < ys - 1)
                        {
                            BottomRight = section[x + 1, y + 1];
                        }
                    }
                    if (y > 0)
                    {
                        TopCenter = section[x, y - 1];
                    }
                    if (y < ys - 1)
                    {
                        BottomCenter = section[x, y + 1];
                    }
                    d = CalculateValue(extrWeightsType, extrWeights, TopLeft, TopCenter, TopRight, CenterLeft, CenterRight, BottomLeft, BottomCenter, BottomRight);
                    if (d == 0)
                    {
                        if (ChoiceType == 0)
                        {
                            if (r.Next(-1, 0) == 0)
                            {
                                d = 1;
                            }
                            else
                            {
                                d = -1;
                            }
                        }
                        else
                        {
                            d = (int)Default;
                        }
                    }
                    if (d < 0)
                    {
                        section[x, y].Value = Switch.Off;
                    }
                    else
                    {
                        section[x, y].Value = Switch.On;
                    }
                    ++x;
                }
                ++y;
                x = 0;
            }
            return(section);
        }