Example #1
0
        public IQuantumState Transform(IQuantumState input)
        {
            if (input.Dimension != 2 * InnerTransform.Dimension)
            {
                throw new ArgumentException(nameof(input));
            }

            var firstHalf = new Complex[Dimension / 2];
            var secHalf   = new Complex[Dimension / 2];

            for (long i = 0; i < Dimension; i++)
            {
                // first half of vector is just copied over as an identity
                if (i < Dimension / 2)
                {
                    firstHalf[i] = input.GetAmplitude(new ComputationalBasis(i, NumQubits));
                }
                else
                {
                    secHalf[i - (Dimension / 2)] = input.GetAmplitude(new ComputationalBasis(i, NumQubits));
                }
            }

            var transformedSecHalf = InnerTransform.Transform(new MultiQubit(secHalf));

            return(new MultiQubit(firstHalf.Concat(transformedSecHalf).ToArray()));
        }
Example #2
0
 /// <summary>
 ///     Calculate function self-scalar values
 /// </summary>
 /// <param name="f">Input values</param>
 /// <param name="ff">Output values</param>
 public static void Scalar(Complex[] f, Complex[] ff)
 {
     var length = ff.Length;
     var complex = f.Concat(Enumerable.Repeat(Complex.Zero, length - f.Length)).ToArray();
     Fourier(complex, FourierDirection.Forward);
     complex = complex.Select(x => x*Complex.Conjugate(x)/length).ToArray();
     Fourier(complex, FourierDirection.Backward);
     Array.Copy(complex, 0, ff, 0, length);
 }
 /// <summary>
 ///     Calculate function self-convolution values
 /// </summary>
 /// <param name="f">Input values</param>
 /// <param name="fxf">Output values</param>
 public static void Convolution(Complex[] f, Complex[] fxf)
 {
     int length = fxf.Length;
     Complex[] complex = f.Concat(Enumerable.Repeat(Complex.Zero, length - f.Length)).ToArray();
     Fourier(complex, FourierDirection.Forward);
     complex = complex.Select(x => x*x/length).ToArray();
     Fourier(complex, FourierDirection.Backward);
     Array.Copy(complex, 0, fxf, 0, length);
 }
 /// <summary>
 ///     Calculate convolution values
 /// </summary>
 /// <param name="f">Input values</param>
 /// <param name="g">Input values</param>
 /// <param name="fxg">Output values</param>
 public static void Convolution(Complex[] f, Complex[] g, Complex[] fxg)
 {
     int length = fxg.Length;
     Complex[] complex = f.Concat(Enumerable.Repeat(Complex.Zero, length - f.Length)).ToArray();
     Fourier(complex, FourierDirection.Forward);
     Complex[] complex1 = g.Concat(Enumerable.Repeat(Complex.Zero, length - g.Length)).ToArray();
     Fourier(complex1, FourierDirection.Forward);
     int index = 0;
     foreach (Complex value in complex1)
         complex[index++] *= value/length;
     Fourier(complex, FourierDirection.Backward);
     Array.Copy(complex, 0, fxg, 0, length);
 }
Example #5
0
 /// <summary>
 ///     Calculate scalar values
 /// </summary>
 /// <param name="f">Input values</param>
 /// <param name="g">Input values</param>
 /// <param name="fg">Output values</param>
 public static void Scalar(Complex[] f, Complex[] g, Complex[] fg)
 {
     var length = fg.Length;
     var complex = f.Concat(Enumerable.Repeat(Complex.Zero, length - f.Length)).ToArray();
     Fourier(complex, FourierDirection.Forward);
     var complex1 = g.Concat(Enumerable.Repeat(Complex.Zero, length - g.Length)).ToArray();
     Fourier(complex1, FourierDirection.Backward);
     var index = 0;
     foreach (var value in complex1)
         complex[index++] *= value/length;
     Fourier(complex, FourierDirection.Backward);
     Array.Copy(complex, 0, fg, 0, length);
 }