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())); }
/// <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); }
/// <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); }