static private void checkMul(ModMatrix a, ModMatrix b) { if (a.col != b.row) { throw new Exception("row and col have to be same."); } }
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); }
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); }
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)); }
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); }
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(); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }