Exemplo n.º 1
0
 static private void checkMul(ModMatrix a, ModMatrix b)
 {
     if (a.col != b.row)
     {
         throw new Exception("row and col have to be same.");
     }
 }
Exemplo n.º 2
0
        public override IEnumerable <object> Solve(TextReader inputStream)
        {
            var(n, k) = inputStream.ReadValue <int, long>();
            var initialVector = new ModVector(Enumerable.Repeat(Modular.One, n).ToArray());
            var matrix        = new ModMatrix(n);

            for (int i = 0; i < n; i++)
            {
                var a = inputStream.ReadIntArray();
                for (int j = 0; j < n; j++)
                {
                    matrix[i, j] = a[j];
                }
            }

            var resultVector = matrix.Pow(k) * initialVector;

            var result = Modular.Zero;

            for (int i = 0; i < resultVector.Length; i++)
            {
                result += resultVector[i];
            }

            yield return(result);
        }
Exemplo n.º 3
0
    static void Main()
    {
        var n       = long.Parse(Console.ReadLine());
        var morning = new ModMatrix(3, 3);
        var other   = new ModMatrix(3, 3);

        for (int i = 0; i < 3; i++)
        {
            for (int j = 0; j < 3; j++)
            {
                if (i == j)
                {
                    continue;
                }
                if (i != 2)
                {
                    morning[i, j] = 1;
                }
                other[i, j] = 1;
            }
        }
        var iv = new ModMatrix(3, 1);

        iv[0, 0] = 1;
        iv[1, 0] = 1;
        var last = Power(other * other * morning, n - 1) * (other * other * iv);

        Console.WriteLine((last[0, 0] + last[1, 0] + last[2, 0]) % 1000000007);
    }
Exemplo n.º 4
0
        public void Solve()
        {
            var a = sc.Long();
            var b = sc.Long();

            ModInteger.Mod = sc.Integer();
            var mat = new ModMatrix(2, 2);

            mat[0, 0] = 10;
            mat[0, 1] = 1;
            mat[1, 1] = 1;
            var vec = new ModMatrix(2, 1);

            vec[0, 0] = 1;
            vec[0, 1] = 1;

            var gcd = MathEx.GCD(a, b);
            var A   = (ModMatrix.Pow(mat, a - 1) * vec)[0, 0];

            mat[0, 0] = ModInteger.Pow(10, gcd);

            var B = (ModMatrix.Pow(mat, b / gcd - 1) * vec)[0, 0];

            IO.Printer.Out.WriteLine(A * B);
            //IO.Printer.Out.WriteLine(A * B * ModInteger.Inverse(GCD));
        }
Exemplo n.º 5
0
    static void Main()
    {
        var l = Read();
        var a = Read();
        var b = Read();
        var m = (int)Read();

        ModMatrix.MOD = m;
        ModInt.MOD    = m;

        long lastRem = 0;
        long n       = 0;

        for (int digits = GetDigits(a); digits < 40; digits++)
        {
            ModMatrix matrix = new ModMatrix(3, 3);
            matrix[0, 0] = Power(10, digits);
            matrix[0, 1] = b;
            matrix[0, 2] = a;
            matrix[1, 1] = 1;
            matrix[1, 2] = 1;
            matrix[2, 2] = 1;
            ModMatrix iv = new ModMatrix(3, 1);
            iv[0, 0] = lastRem;
            iv[1, 0] = n;
            iv[2, 0] = 1;

            BigInteger valid   = n - 1;
            BigInteger invalid = new BigInteger(long.MaxValue) * 1000000;
            while (invalid - valid > 1)
            {
                var mid = (valid + invalid) / 2;
                if (GetDigits(a + b * mid) == digits)
                {
                    valid = mid;
                }
                else
                {
                    invalid = mid;
                }
            }

            if (l - 1 <= valid)
            {
                valid = l - 1;
            }

            var count     = (long)valid - n + 1;
            var resMatrix = Power(matrix, count) * iv;
            lastRem = resMatrix[0, 0];
            n       = (long)valid + 1;
            if (valid == l - 1)
            {
                break;
            }
        }
        Console.WriteLine(lastRem);
    }
Exemplo n.º 6
0
        public Voice(double samplerate, int bufferSize)
        {
            this.samplerate = samplerate;
            bufsize         = bufferSize;

            ampEnvBuffer     = new double[bufsize];
            filter1EnvBuffer = new double[bufsize];
            filter2EnvBuffer = new double[bufsize];

            path1Buffer     = new double[bufsize];
            path2Buffer     = new double[bufsize];
            processBuffer   = new double[bufsize];
            OutputBuffer    = new double[2][];
            OutputBuffer[0] = new double[48000];
            OutputBuffer[1] = new double[48000];

            Modules = new Dictionary <ModuleId, object>();

            Osc1 = new MultiOsc(samplerate, bufsize);
            Osc2 = new BlOsc(samplerate, bufsize);
            Osc3 = new BlOsc(samplerate, bufsize);
            Osc4 = new BlOsc(samplerate, bufsize);

            //Ins1 = new InsRedux(samplerate, Bufsize);
            //Ins2 = new InsRedux(samplerate, Bufsize);
            Ins1 = new InsDistortion(samplerate, bufsize);
            Ins2 = new InsDistortion(samplerate, bufsize);

            Filter1 = new DualFilter(samplerate, bufsize);
            Filter2 = new DualFilter(samplerate, bufsize);

            AmpEnv     = new Ahdsr(samplerate);
            Filter1Env = new Ahdsr(samplerate);
            Filter2Env = new Ahdsr(samplerate);

            Mod1 = new Modulator(samplerate);
            Mod2 = new Modulator(samplerate);
            Mod3 = new Modulator(samplerate);
            Mod4 = new Modulator(samplerate);
            Mod5 = new Modulator(samplerate);
            Mod6 = new Modulator(samplerate);

            MidiInput = new MidiInput();
            ModMatrix = new ModMatrix(this);
            Mixer     = new Mixer();

            RefreshModuleObjects();

            Mod1.UpdateStepsize();
            Mod2.UpdateStepsize();
            Mod3.UpdateStepsize();
            Mod4.UpdateStepsize();
            Mod5.UpdateStepsize();
            Mod6.UpdateStepsize();
            Mixer.Update();
        }
Exemplo n.º 7
0
    public static ModMatrix[] PowTable(ModMatrix m, int k)
    {
        var ret = new ModMatrix[k];

        ret[0] = m;
        for (int i = 1; i < k; i++)
        {
            ret[i] = ret[i - 1] * ret[i - 1];
        }
        return(ret);
    }
Exemplo n.º 8
0
    public static ModMatrix Trans(ModMatrix m)
    {
        var ret = new ModMatrix(m.col, m.row);

        for (int i = 0; i < m.row; i++)
        {
            for (int j = 0; j < m.col; j++)
            {
                ret.mat[j * m.col + i] = m.mat[i * m.col + j];
            }
        }
        return(ret);
    }
Exemplo n.º 9
0
    public static ModMatrix operator +(ModMatrix l, ModMatrix r)
    {
        check(l, r);
        var ret = new ModMatrix(l.row, l.col);

        for (int i = 0; i < l.row; i++)
        {
            for (int j = 0; j < l.col; j++)
            {
                ret.mat[i * ret.col + j] = l.mat[i * l.col + j] + r.mat[i * r.col + j];
            }
        }
        return(ret);
    }
Exemplo n.º 10
0
    static ModMatrix Power(ModMatrix n, long m)
    {
        ModMatrix pow = n;
        ModMatrix res = ModMatrix.GetScalarMatrix(n.Height, 1);

        while (m > 0)
        {
            if ((m & 1) == 1)
            {
                res *= pow;
            }
            pow *= pow;
            m  >>= 1;
        }
        return(res);
    }
Exemplo n.º 11
0
    public static ModMatrix operator *(ModMatrix l, ModMatrix r)
    {
        checkMul(l, r);
        var ret = new ModMatrix(l.row, r.col);

        for (int i = 0; i < l.row; i++)
        {
            for (int k = 0; k < l.col; k++)
            {
                for (int j = 0; j < r.col; j++)
                {
                    ret.mat[i * r.col + j] = (ret.mat[i * r.col + j] + l.mat[i * l.col + k] * r.mat[k * r.col + j]);
                }
            }
        }
        return(ret);
    }
Exemplo n.º 12
0
    public static ModMatrix PowWithTable(ModMatrix m, long n, ModMatrix[] table)
    {
        var ret = new ModMatrix(m.row, m.col);

        for (int i = 0; i < m.row; i++)
        {
            ret.mat[i * m.col + i] = 1;
        }
        for (int i = 0; i < table.Length; i++)
        {
            if ((n & 1) == 1)
            {
                ret = ret * table[i];
            }
        }
        return(ret);
    }
Exemplo n.º 13
0
    public static ModMatrix Pow(ModMatrix m, long n)
    {
        var ret = new ModMatrix(m.row, m.col);

        for (int i = 0; i < m.row; i++)
        {
            ret.mat[i * m.col + i] = 1;
        }
        for (; n > 0; m *= m, n >>= 1)
        {
            if ((n & 1) == 1)
            {
                ret = ret * m;
            }
        }
        return(ret);
    }
Exemplo n.º 14
0
    public static ModMatrix Multiple(ModMatrix a, ModMatrix b)
    {
        Debug.Assert(a.Width == b.Height);
        var res = new ModMatrix(a.Height, b.Width);

        for (int i = 0; i < a.Height; i++)
        {
            for (int j = 0; j < b.Width; j++)
            {
                for (int k = 0; k < a.Width; k++)
                {
                    res[i, j] += a[i, k] * b[k, j];
                    res[i, j] %= MOD;
                }
            }
        }
        return(res);
    }
Exemplo n.º 15
0
    static ModMatrix Power(ModMatrix n, long m)
    {
        ModMatrix pow = n;
        ModMatrix res = new ModMatrix(n.Height, n.Width);

        for (int i = 0; i < n.Height; i++)
        {
            res[i, i] = 1;
        }
        while (m > 0)
        {
            if ((m & 1) == 1)
            {
                res *= pow;
            }
            pow *= pow;
            m  >>= 1;
        }
        return(res);
    }
Exemplo n.º 16
0
        public void Execute()
        {
            ProgressChanged(0, 1);

            if (!CheckParameters())
            {
                return;
            }

            if (!settings.Action)
            {
                mat = inv;                      // decrypt
            }
            GuiLogMessage("The matrix is " + mat, NotificationLevel.Debug);

            Output = "";

            BigInteger[] result, vector = new BigInteger[mat.Dimension];

            for (int j = 0; j < Input.Length; j += mat.Dimension)
            {
                for (int k = 0; k < mat.Dimension; k++)
                {
                    vector[k] = settings.Alphabet.IndexOf(Input[j + k]);
                }
                result = mat * vector;
                for (int k = 0; k < mat.Dimension; k++)
                {
                    Output += settings.Alphabet[(int)result[k]];
                }
            }

            OnPropertyChanged("Output");

            ProgressChanged(1, 1);
        }
Exemplo n.º 17
0
    static void Main()
    {
        int n = int.Parse(Console.ReadLine());
        //matrix[i,j]:vector[i]????a????i???j???a????????(DP??????)
        ModMatrix matrix = new ModMatrix(4 * 4 * 4, 4 * 4 * 4);

        //t : 0
        //a : 1
        //g : 2
        //c : 3

        for (int i = 0; i < matrix.Height; i++)
        {
            int val = i;

            //t s f
            int firstLiteral = val % 4;
            val /= 4;
            int secondLiteral = val % 4;
            val /= 4;
            int thirdLiteral = val % 4;


            //?????agc,gac,acg,a_gc,ag_c

            //t???????
            matrix[i, (secondLiteral * 4 + firstLiteral) * 4 + 0] += 1;

            //a???????
            matrix[i, (secondLiteral * 4 + firstLiteral) * 4 + 1] += 1;

            //g???????:acg??????
            if (!(secondLiteral == 1 && firstLiteral == 3 /*acg*/))
            {
                matrix[i, (secondLiteral * 4 + firstLiteral) * 4 + 2] += 1;
            }

            //c??????? : agc,gac,a_gc,ag_c??????
            if (!(secondLiteral == 1 && firstLiteral == 2 /*agc*/) &&
                !(secondLiteral == 2 && firstLiteral == 1 /*gac*/) &&
                !(thirdLiteral == 1 && firstLiteral == 2 /*a_gc*/) &&
                !(thirdLiteral == 1 && secondLiteral == 2 /*ag_c*/))
            {
                matrix[i, (secondLiteral * 4 + firstLiteral) * 4 + 3] += 1;
            }
        }

        ModMatrix res = new ModMatrix(1, 4 * 4 * 4);

        res[0, 0] = 1;
        while (n > 0)
        {
            if ((n & 1) == 1)
            {
                res *= matrix;
            }
            matrix *= matrix;
            n     >>= 1;
        }

        long resSum = 0;

        for (int i = 0; i < res.Width; i++)
        {
            resSum += res[0, i];
        }
        Console.WriteLine(resSum % 1000000007);
    }
Exemplo n.º 18
0
    static void Main()
    {
        //matrix[i,j]:vector[i]の要素が1であればi行目のj要素に乗算が行われ、そこに遷移する
        var       nk     = Console.ReadLine().Split().Select(int.Parse).ToArray();
        int       n      = nk[0];
        int       k      = nk[1];
        ModMatrix matrix = new ModMatrix(k * k * k, k * k * k);

        //k=2の時
        //  a : 01010101
        // ab : 00110011
        //abc : 00001111
        for (int i = 0; i < matrix.Height; i++)
        {
            int val    = i;
            int aCount = val % k;
            val /= k;
            int abCount = val % k;
            val /= k;
            int abcCount = val % k;

            int newACount, newABCount, newABCCount;
            //aが追加された時
            newACount   = (aCount + 1) % k;
            newABCount  = abCount;
            newABCCount = abcCount;
            matrix[i, (newABCCount * k + newABCount) * k + newACount] += 1;

            //bが追加された時
            newACount   = aCount;
            newABCount  = (abCount + aCount) % k;
            newABCCount = abcCount;
            matrix[i, (newABCCount * k + newABCount) * k + newACount] += 1;

            //cが追加された時
            newACount   = aCount;
            newABCount  = abCount;
            newABCCount = (abcCount + abCount) % k;
            matrix[i, (newABCCount * k + newABCount) * k + newACount] += 1;
        }

        ModMatrix res = new ModMatrix(1, k * k * k);

        res[0, 0] = 1;

        long pow = n;

        while (n > 0)
        {
            if ((n & 1) == 1)
            {
                res *= matrix;
            }
            matrix *= matrix;
            n     >>= 1;
        }

        long resSum = 0;

        for (int i = 0; i < k * k; i++)
        {
            resSum += res[0, i];
        }
        Console.WriteLine(resSum % 998244353);
    }
Exemplo n.º 19
0
    static void Main()
    {
        int n = int.Parse(Console.ReadLine());
        //matrix[i,j]:vector[i]の要素がaであればi行目のj要素にaで乗算が行われる(DPの遷移と同じ)
        ModMatrix matrix = new ModMatrix(4 * 4 * 4, 4 * 4 * 4);

        //t : 0
        //a : 1
        //g : 2
        //c : 3

        for (int i = 0; i < matrix.Height; i++)
        {
            int val = i;

            //t s f
            int firstLiteral = val % 4;
            val /= 4;
            int secondLiteral = val % 4;
            val /= 4;
            int thirdLiteral = val % 4;


            //ダメなのはagc,gac,acg,a_gc,ag_c

            //tが追加された時
            matrix[i, (secondLiteral * 4 + firstLiteral) * 4 + 0] += 1;

            //aが追加された時
            matrix[i, (secondLiteral * 4 + firstLiteral) * 4 + 1] += 1;

            //gが追加された時:acgが起こりうる
            if (!(secondLiteral == 1 && firstLiteral == 3 /*acg*/))
            {
                matrix[i, (secondLiteral * 4 + firstLiteral) * 4 + 2] += 1;
            }

            //cが追加された時 : agc,gac,a_gc,ag_cが起こりうる
            if (!(secondLiteral == 1 && firstLiteral == 2 /*agc*/) &&
                !(secondLiteral == 2 && firstLiteral == 1 /*gac*/) &&
                !(thirdLiteral == 1 && firstLiteral == 2 /*a_gc*/) &&
                !(thirdLiteral == 1 && secondLiteral == 2 /*ag_c*/))
            {
                matrix[i, (secondLiteral * 4 + firstLiteral) * 4 + 3] += 1;
            }
        }

        ModMatrix res = new ModMatrix(1, 4 * 4 * 4);

        res[0, 0] = 1;
        while (n > 0)
        {
            if ((n & 1) == 1)
            {
                res *= matrix;
            }
            matrix *= matrix;
            n     >>= 1;
        }

        long resSum = 0;

        for (int i = 0; i < res.Width; i++)
        {
            resSum += res[0, i];
        }
        Console.WriteLine(resSum % 1000000007);
    }
Exemplo n.º 20
0
        private bool CheckParameters()
        {
            int dim;

            string[]     s = null;
            BigInteger[] matelements;

            if (Matrix == null)
            {
                // get matrix from settings
                s           = settings.MatrixString.Split(',');
                dim         = (int)Math.Sqrt(s.Length);
                matelements = new BigInteger[dim];
            }
            else
            {
                // get matrix from matrix input
                matelements = Matrix;
                dim         = (int)Math.Sqrt(Matrix.Length);
            }

            if (dim < 1)
            {
                GuiLogMessage("The dimension of the matrix must be greater than 0!", NotificationLevel.Error);
                return(false);
            }

            if (dim * dim != Matrix.Length)
            {
                GuiLogMessage("The number of elements in the matrix definition must be a square number!", NotificationLevel.Error);
                return(false);
            }

            if (settings.Modulus < 2)
            {
                GuiLogMessage(String.Format("The input alphabet must contain at least 2 different characters!"), NotificationLevel.Error);
                return(false);
            }

            if (Input.Length % dim != 0)
            {
                GuiLogMessage(String.Format("The input was padded so that its length is a multiple of the matrix dimension ({0})!", dim), NotificationLevel.Warning);
                char paddingChar = settings.Alphabet.Contains("X") ? 'X' : (settings.Alphabet.Contains("x") ? 'x' : settings.Alphabet[settings.Modulus - 1]);
                Input += new String(paddingChar, dim - (Input.Length % dim));
            }

            for (int j = 0; j < Input.Length; j++)
            {
                if (settings.Alphabet.IndexOf(Input[j]) < 0)
                {
                    GuiLogMessage(String.Format("The input contains the illegal character '{0}' at position {1}!", Input[j], j), NotificationLevel.Error);
                    return(false);
                }
            }

            if (Matrix == null)
            {
                // read the matrix from the settings string

                int i = 0;

                try
                {
                    for (i = 0; i < dim; i++)
                    {
                        matelements[i] = BigInteger.Parse(s[i]);
                    }
                }
                catch (Exception ex)
                {
                    GuiLogMessage(string.Format("Error while parsing matrix element {0}: \"{1}\"!", i, s[i]), NotificationLevel.Error);
                    return(false);
                }
            }

            mat = new ModMatrix(dim, settings.Modulus);

            int k = -1;

            for (int y = 0; y < mat.Dimension; y++)
            {
                for (int x = 0; x < mat.Dimension; x++)
                {
                    mat[x, y] = matelements[++k];
                }
            }

            inv = mat.invert();

            if (inv == null)
            {
                GuiLogMessage("The matrix " + mat + " is not invertible.", NotificationLevel.Error);
                return(false);
            }

            return(true);
        }