public static void AddModuloQFT(this QuantumComputer comp, ulong a, ulong N, RegisterRef ctrl, Register b, params RegisterRef[] controls)
 {
     Validate(a, b, N);
     comp.QFT(b);
     comp.AddModuloQFTPhi(a, N, ctrl, b, controls);
     comp.InverseQFT(b);
 }
        public static void MultModuloQFT(this QuantumComputer comp, ulong a, ulong N, RegisterRef ctrl, Register x, Register b, RegisterRef control)
        {
            Validate(a, b, N);
            comp.QFT(b);

            for (int i = 0; i < x.Width; i++)
            {
                //Console.WriteLine("MultModulo i = {2}, a = {0}, N = {1}", a, N, i);
                comp.AddModuloQFTPhi(((((ulong)1 << i) * a) % N), N, ctrl, b, x[i], control);
            }

            comp.InverseQFT(b);
        }
        public static void AddModuloQFT(this QuantumComputer comp, ulong a, ulong N, RegisterRef ctrl, Register b, params RegisterRef[] controls)
        {
            if (comp.Group)
            {
                object[] parameters = new object[] { comp, a, N, ctrl, b, controls };
                comp.AddParametricGate("AddModuloQFT", parameters);
                return;
            }
            else
            {
                comp.Group = true;
            }

            Validate(a, b, N);
            comp.QFT(b);
            comp.AddModuloQFTPhi(a, N, ctrl, b, controls);
            comp.InverseQFT(b);
        }
        public static void MultModuloQFT(this QuantumComputer comp, ulong a, ulong N, RegisterRef ctrl, Register x, Register b, RegisterRef control)
        {
            if (comp.Group)
            {
                object[] parameters = new object[] { comp, a, N, ctrl, x, b, control };
                comp.AddParametricGate("MultModuloQFT", parameters);
                return;
            }
            else
            {
                comp.Group = true;
            }

            Validate(a, b, N);
            comp.QFT(b);

            for (int i = 0; i < x.Width; i++)
            {
                comp.AddModuloQFTPhi(((((ulong)1 << i) * a) % N), N, ctrl, b, x[i], control);
            }

            comp.InverseQFT(b);
        }