Пример #1
0
        static public void TestMethod()
        {
            var matrixArray = new Matrix[2];

            Complex[,] array0 = { { 1, 0 },
                                  { 0, 0 } };
            matrixArray[0]    = (Matrix)Matrix.Build.DenseOfArray(array0);
            Complex[,] array1 = { { 0, 0 },
                                  { 0, 1 } };
            matrixArray[1] = (Matrix)Matrix.Build.DenseOfArray(array1);
            var superOperator = new SuperOperator(matrixArray);

            Complex[,] array2 = { { 0.5, 0.5 },
                                  { 0.5, 0.5 } };
            var pureDensityOperator = new DensityOperator((Matrix)Matrix.Build.DenseOfArray(array2));

            SuperMatrixTrans(pureDensityOperator, superOperator);
            Console.WriteLine($"pureDensityOperator = {pureDensityOperator.Value.ToComplexString()}");
        }
Пример #2
0
        static void QuantumChannelProcess(DensityOperator[] densityopEncArray)
        {
            // E0,E1 for Kraus Opearator,Bit Flip channel
            // E0= (|0><0| + |1><1|)/sqrt(2),E1=  (|0><1|+|1><0|)/sqrt(2)
            var matrixArrayE = new Matrix[2];

            Complex[,] arrayTemp0 = { { Sqrt(0.9),         0 },
                                      {         0, Sqrt(0.9) } };
            matrixArrayE[0]       = (Matrix)Matrix.Build.DenseOfArray(arrayTemp0);
            Complex[,] arrayTemp1 = { {         0, Sqrt(0.1) },
                                      { Sqrt(0.1),         0 } };
            matrixArrayE[1] = (Matrix)Matrix.Build.DenseOfArray(arrayTemp1);
            var superE = new SuperOperator(matrixArrayE);
            //-----------------------------Bit Flip channel Ends-----------------

            // E0,E1 for Kraus Opearator,I channel
            // E0= (|0><0| + |1><1|)/sqrt(2),E1=  (|0><0|+|1><1|)/sqrt(2)
            var matrixArrayE2 = new Matrix[2];

            Complex[,] arrayTemp0a = { { 1 / Sqrt(2),           0 },
                                       {           0, 1 / Sqrt(2) } };
            matrixArrayE2[0]       = (Matrix)Matrix.Build.DenseOfArray(arrayTemp0a);
            Complex[,] arrayTemp1a = { { 1 / Sqrt(2),           0 },
                                       {           0, 1 / Sqrt(2) } };
            matrixArrayE2[1] = (Matrix)Matrix.Build.DenseOfArray(arrayTemp1a);
            var superE2 = new SuperOperator(matrixArrayE2);

            //-----------------------------I channel Ends-----------------



            foreach (var densityopMember in densityopEncArray)
            {
                SuperMatrixTrans(densityopMember, superE);   //This needs a densityoperator, we only provide ket.In channel, only accept densityoperator
                // SuperMatrixTrans(densityopMember, superE2);
            }
        }
Пример #3
0
        static public void TestMethod(int loopCount)
        {
            // E0,E1 for Kraus Opearator
            // E0= (|0><0| + |1><1|)/sqrt(2),E1=  (|0><1|)/sqrt(2)
            var matrixArrayE = new Matrix[2];

            Complex[,] array0 = { { 1,           0 },
                                  { 0, 1 / Sqrt(2) } };
            matrixArrayE[0]   = (Matrix)Matrix.Build.DenseOfArray(array0);
            Complex[,] array1 = { { 0, 1 / Sqrt(2) },
                                  { 0,           0 } };
            matrixArrayE[1] = (Matrix)Matrix.Build.DenseOfArray(array1);
            var superE = new SuperOperator(matrixArrayE);

            //rou for main state, it is a pure state|+><+|
            Complex[,] array2 = { { 0.5, 0.5 },
                                  { 0.5, 0.5 } };
            //var pureDensityOperator = new PureDensityOperator((Matrix)Matrix.Build.DenseOfArray(array2));



            int count;
            var countNumber = new SortedDictionary <int, int>();

            for (var i = 0; i < loopCount; i++)
            {
                var rou = new DensityOperator((Matrix)Matrix.Build.DenseOfArray(array2));
                count = 0;
                SuperMatrixTrans(rou, superE);

                qwhile(rou, MeasureMatrixZeroOne, 1,
                       () =>
                {
                    rou.UnitaryTransH(HGate.Value);
                    count++;

                    if (count > 1000)
                    {
                        return(CWHILEFLOW.BREAK);
                    }
                    return(CWHILEFLOW.CONTINUE);
                }
                       );

                if (countNumber.ContainsKey(count))
                {
                    countNumber[count]++;
                }
                else
                {
                    countNumber[count] = 1;
                }
            }

            foreach (var pair in countNumber)
            {
                Console.WriteLine($"{pair.Key} is {pair.Value}");
            }

            // Console.WriteLine($"pureDensityOperator = {rou.Value}");
        }