Exemplo n.º 1
0
 private void Form1_Load(object sender, EventArgs e)
 {
     GF5           = new FiniteField(5);
     GF56Primitive = new Polynomial(GF5, 2, 0, 1, 4, 1, 0, 1);
     ExtF          = new ExtensionField(GF56Primitive);
     lblInfo.Text  = "Current Field Info: " + ExtF.ToString();
 }
Exemplo n.º 2
0
        private void btnFixField_Click(object sender, EventArgs e)
        {
            int  t    = 0;
            bool dene = int.TryParse(txtSize.Text.Trim(), out t);

            if (dene)
            {
                if (MathTools.IsPrime(t))
                {
                    p            = t;
                    F            = new FiniteField(p);
                    lblInfo.Text = "Current Field: " + F.ToString();
                }
                else
                {
                    MessageBox.Show("Please enter a prime number!", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    txtSize.Focus();
                }
            }
            else
            {
                MessageBox.Show("Please check the value you have written!", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                txtSize.Focus();
            }

            btnFixField.Enabled  = false;
            btnFixValues.Enabled = true;
            //lblInfo.Text = "Please enter the parameters";
        }
Exemplo n.º 3
0
    public static void Main()
    {
        int H, W, A, B;

        string[] str = Console.ReadLine().Split(' ');
        H = int.Parse(str[0]);
        W = int.Parse(str[1]);
        A = int.Parse(str[2]);
        B = int.Parse(str[3]);
        FiniteField.Factorial(W + H);
        FiniteField[] T = new FiniteField[W];
        for (int i = 0; i < W - B; i++)
        {
            T[i] = FiniteField.nCm(H - A - 1 + B + i, H - A - 1);
        }

        FiniteField sum = 0;

        for (int i = 0; i < W - B; i++)
        {
            sum += T[i] * FiniteField.nCm(W - B - 1 - i + A - 1, A - 1);
        }

        Console.WriteLine(sum.ToString());
    }
Exemplo n.º 4
0
        void FindOrderThreaded()
        {
            try
            {
                int p = (int)Tab1nupFieldSize.Value;

                if (!MathTools.IsPrime(p))
                {
                    MessageBox.Show("Finite Field size must be a prime number!", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    return;
                }

                FiniteField F = new FiniteField(p);

                Polynomial P = Polynomial.Parse(F, Tab1txtPolyCoefs.Text.Trim(), true);
                Tab1lblResult.Text  = "";
                Tab1lblResult.Text += "Recognized polynomial: " + P.ToString() + "\r\n\r\nComputing the order...\r\n\r\n";
                Application.DoEvents();

                int order = P.Order;

                Tab1lblResult.Text += "Order of the polynomial is " + order.ToString();
            }
            catch (Exception exp)
            {
                MessageBox.Show(exp.Message);
            }
        }
Exemplo n.º 5
0
        private void txtSize_Leave(object sender, EventArgs e)
        {
            int  t    = 0;
            bool dene = int.TryParse(txtSize.Text.Trim(), out t);

            if (dene)
            {
                if (MathTools.IsPrime(t))
                {
                    eskip        = p;
                    p            = t;
                    F            = new FiniteField(p);
                    lblInfo.Text = "Current Field: " + F.ToString();
                    if (eskip > p)
                    {
                        txtSeq.Clear();
                        txtResult.Clear();
                    }
                }
                else
                {
                    MessageBox.Show("Please enter a prime number!", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    txtSize.Focus();
                }
            }
            else
            {
                MessageBox.Show("Please check the value you have written!", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                txtSize.Focus();
            }
        }
Exemplo n.º 6
0
        public void DivideByZeroThrowsExeption()
        {
            FiniteField.Mod = 17;

            var x = new FiniteField(9);
            var y = new FiniteField(0);

            Assert.Throws <DivideByZeroException>(() => x / y);
        }
Exemplo n.º 7
0
        public void AddTwoNumbers()
        {
            FiniteField.Mod = 17;

            var x = new FiniteField(9);
            var y = new FiniteField(12);

            var actual   = x + y;
            var expected = new FiniteField(4);

            Assert.Equal(actual, expected);
        }
Exemplo n.º 8
0
        public void MultiplyTwoNumbers()
        {
            FiniteField.Mod = 17;

            var x = new FiniteField(9);
            var y = new FiniteField(12);

            var actual   = x * y;
            var expected = new FiniteField((9 * 12) % FiniteField.Mod);

            Assert.Equal(actual, expected);
        }
Exemplo n.º 9
0
        public void DivideTwoNumbers()
        {
            FiniteField.Mod = 17;

            var x = new FiniteField(9);
            var y = new FiniteField(12);

            var actual   = x / y;
            var expected = new FiniteField(5);

            Assert.Equal(actual, expected);
        }
Exemplo n.º 10
0
        protected void btnRunBM_Click(object sender, EventArgs e)
        {
            FiniteField F = null;
            int         p = int.Parse(txtSize.Text.Trim());

            if (MathTools.IsPrime(p))
            {
                F = new FiniteField(p);
            }
            else
            {
                Response.Clear();
                Response.Write("Please write a prime number!");
                Response.End();
            }

            // Clean The Mess
            string seq = txtSeq.Text, newseq = "";

            for (int i = 0; i < seq.Length; i++)
            {
                int  t    = 0;
                bool dene = int.TryParse(seq[i].ToString(), out t);
                if (dene)
                {
                    if (t < F.Characteristic)
                    {
                        newseq += seq[i];
                    }
                }
            }

            if (newseq.Length == 0)
            {
                Response.Clear();
                Response.Write("Please enter the sequence.");
                Response.End();
            }

            txtSeq.Text = newseq;
            Polynomial poly = Polynomial.Parse(F, newseq, false);
            Polynomial c;
            int        LC = LFSRTools.BerlekampMassey(poly, out c);

            lblResult.Text = "Sequence Length = " + newseq.Length + "<br/>" +
                             "Linear Complexity = " + LC + "<br/>" +
                             "Connection Polynomial = " + c.ToString();
        }
Exemplo n.º 11
0
    public static void Main()
    {
        string[] s = Console.ReadLine().Split(' ');
        int      H = int.Parse(s[0]);
        int      W = int.Parse(s[1]);
        int      K = int.Parse(s[2]);

        FiniteField[][] dp = new FiniteField[H + 1][];
        for (int i = 0; i <= H; i++)
        {
            dp[i] = new FiniteField[W];
        }

        FiniteField[] com = new FiniteField[W + 1];
        com[0] = new FiniteField(1);
        if (W > 1)
        {
            com[1] = new FiniteField(1);
        }
        for (int i = 2; i <= W; i++)
        {
            com[i] = com[i - 1] + com[i - 2];
        }

        Func <int, FiniteField>      Combination = x => (1 <= x && x <= W) ? com[x] : new FiniteField(1);
        Func <int, int, FiniteField> Access      = (i, j) => (0 <= i && i <= H && 0 <= j && j < W) ? dp[i][j] : new FiniteField(0);

        dp[0][0] = new FiniteField(1);

        for (int i = 1; i <= H; i++)
        {
            for (int j = 0; j < W; j++)
            {
                dp[i][j] =
                    Access(i - 1, j) * Combination(j - 0) * Combination(W - j - 1) +
                    Access(i - 1, j - 1) * Combination(j - 1) * Combination(W - j - 1) +
                    Access(i - 1, j + 1) * Combination(j - 0) * Combination(W - j - 2);
            }
        }
        Console.WriteLine(dp[H][K - 1]);
    }
Exemplo n.º 12
0
        void GetTab2Ready()
        {
            // Finite Field
            F3 = new FiniteField(3);

            // LFSR 1 - 3
            string     strf1 = "201", stri1 = "001";
            Polynomial feedback1 = Polynomial.Parse(F3, strf1, false);
            Polynomial initial1  = Polynomial.Parse(F3, stri1, false);

            L1 = new LFSR(feedback1, initial1.Coefficients);
            Tab2lblLFSR1.Text += "\r\n" + "Feedback: " + Polynomial.Parse(F3, "1" + strf1, false).ToString() + "\r\nInitial: " + stri1 + "\r\nPeriod = " + L1.Period;

            // LFSR 2 - 4
            string     strf2 = "2001", stri2 = "0001";
            Polynomial feedback2 = Polynomial.Parse(F3, strf2, false);
            Polynomial initial2  = Polynomial.Parse(F3, stri2, false);

            L2 = new LFSR(feedback2, initial2.Coefficients);
            Tab2lblLFSR2.Text += "\r\n" + "Feedback: " + Polynomial.Parse(F3, "2" + strf2, false).ToString() + "\r\nInitial: " + stri2 + "\r\nPeriod = " + L2.Period;

            // LFSR 3 - 5
            string     strf3 = "20001", stri3 = "00001";
            Polynomial feedback3 = Polynomial.Parse(F3, strf3, false);
            Polynomial initial3  = Polynomial.Parse(F3, stri3, false);

            L3 = new LFSR(feedback3, initial3.Coefficients);
            Tab2lblLFSR3.Text += "\r\n" + "Feedback: " + Polynomial.Parse(F3, "1" + strf3, false).ToString() + "\r\nInitial: " + stri3 + "\r\nPeriod = " + L3.Period;

            // LFSR 4 - 7
            string     strf4 = "0000201", stri4 = "1012220";
            Polynomial feedback4 = Polynomial.Parse(F3, strf4, false);
            Polynomial initial4  = Polynomial.Parse(F3, stri4, false);

            L4 = new LFSR(feedback4, initial4.Coefficients);
            Tab2lblLFSR4.Text += "\r\n" + "Feedback: " + Polynomial.Parse(F3, "1" + strf4, false).ToString() + "\r\nInitial: " + stri4 + "\r\nPeriod = 26 (precomputed)";// +L4.Period;

            // Nonlinear Combiner
            NonlinCombOutput        = "";
            Tab2lblNonLinComb.Text += "\r\n(X1+X3) * (X2+X4)";
        }
Exemplo n.º 13
0
 public void Exponentiation(FiniteField a, long pow, FiniteField result)
 {
     Assert.True(FiniteField.Pow(a, pow) == result);
 }
Exemplo n.º 14
0
 public void Division(FiniteField a, FiniteField b, FiniteField result)
 {
     Assert.True(a / b == result);
 }
Exemplo n.º 15
0
 public void Multiply(FiniteField a, FiniteField b, FiniteField result)
 {
     Assert.True(a * b == result);
 }
Exemplo n.º 16
0
 public void Subtraction(FiniteField a, FiniteField b, FiniteField result)
 {
     Assert.True(a - b == result);
 }
Exemplo n.º 17
0
 public void Addition(FiniteField a, FiniteField b, FiniteField result)
 {
     Assert.True(a + b == result);
 }
Exemplo n.º 18
0
 public void NonEquality(FiniteField a, FiniteField b)
 {
     Assert.NotEqual(a, b);
 }
Exemplo n.º 19
0
 public void Equality(FiniteField a, FiniteField b)
 {
     Assert.Equal(a, b);
 }
Exemplo n.º 20
0
    public static void Main()
    {
        int N = int.Parse(Console.ReadLine());

        FiniteField[][][][] dp = new FiniteField[N + 1][][][];
        for (int i = 0; i <= N; i++)
        {
            dp[i] = new FiniteField[4][][];
            for (int j = 0; j < 4; j++)
            {
                dp[i][j] = new FiniteField[4][];
                for (int k = 0; k < 4; k++)
                {
                    dp[i][j][k] = new FiniteField[4];
                }
            }
        }
        dp[3][0][0][0] = 1;
        dp[3][0][0][1] = 1;
        dp[3][0][0][2] = 1;
        dp[3][0][0][3] = 1;
        dp[3][0][1][0] = 1;
        dp[3][0][1][1] = 1;
        dp[3][0][1][2] = 1;
        dp[3][0][1][3] = 1;
        dp[3][0][2][0] = 1;
        dp[3][0][2][1] = 1;
        dp[3][0][2][2] = 1;
        dp[3][0][2][3] = 1;
        dp[3][0][3][0] = 1;
        dp[3][0][3][1] = 1;
        dp[3][0][3][2] = 1;
        dp[3][0][3][3] = 1;

        dp[3][1][0][0] = 1;
        dp[3][1][0][1] = 1;
        dp[3][1][0][2] = 1;
        dp[3][1][0][3] = 1;
        dp[3][1][1][0] = 1;
        dp[3][1][1][1] = 1;
        dp[3][1][1][2] = 1;
        dp[3][1][1][3] = 1;
        dp[3][1][2][0] = 0;
        dp[3][1][2][1] = 1;
        dp[3][1][2][2] = 1;
        dp[3][1][2][3] = 1;
        dp[3][1][3][0] = 1;
        dp[3][1][3][1] = 1;
        dp[3][1][3][2] = 1;
        dp[3][1][3][3] = 1;

        dp[3][2][0][0] = 1;
        dp[3][2][0][1] = 0;
        dp[3][2][0][2] = 1;
        dp[3][2][0][3] = 1;
        dp[3][2][1][0] = 0;
        dp[3][2][1][1] = 1;
        dp[3][2][1][2] = 1;
        dp[3][2][1][3] = 1;
        dp[3][2][2][0] = 1;
        dp[3][2][2][1] = 1;
        dp[3][2][2][2] = 1;
        dp[3][2][2][3] = 1;
        dp[3][2][3][0] = 1;
        dp[3][2][3][1] = 1;
        dp[3][2][3][2] = 1;
        dp[3][2][3][3] = 1;

        dp[3][3][0][0] = 1;
        dp[3][3][0][1] = 1;
        dp[3][3][0][2] = 1;
        dp[3][3][0][3] = 1;
        dp[3][3][1][0] = 1;
        dp[3][3][1][1] = 1;
        dp[3][3][1][2] = 1;
        dp[3][3][1][3] = 1;
        dp[3][3][2][0] = 1;
        dp[3][3][2][1] = 1;
        dp[3][3][2][2] = 1;
        dp[3][3][2][3] = 1;
        dp[3][3][3][0] = 1;
        dp[3][3][3][1] = 1;
        dp[3][3][3][2] = 1;
        dp[3][3][3][3] = 1;

        for (int i = 4; i <= N; i++)
        {
            dp[i][0][0][0] = dp[i - 1][0][0][0] + dp[i - 1][0][0][1] + dp[i - 1][0][0][2] + dp[i - 1][0][0][3];
            dp[i][0][0][1] = dp[i - 1][0][1][0] + dp[i - 1][0][1][1] + dp[i - 1][0][1][2] + dp[i - 1][0][1][3];
            dp[i][0][0][2] = dp[i - 1][0][2][0] + dp[i - 1][0][2][1] + dp[i - 1][0][2][2] + dp[i - 1][0][2][3];
            dp[i][0][0][3] = dp[i - 1][0][3][0] + dp[i - 1][0][3][1] + dp[i - 1][0][3][2] + dp[i - 1][0][3][3];
            dp[i][0][1][0] = dp[i - 1][1][0][0] + dp[i - 1][1][0][1] + dp[i - 1][1][0][2] + dp[i - 1][1][0][3];
            dp[i][0][1][1] = dp[i - 1][1][1][0] + dp[i - 1][1][1][1] + dp[i - 1][1][1][2] + dp[i - 1][1][1][3];
            dp[i][0][1][2] = dp[i - 1][1][2][0] + dp[i - 1][1][2][1] + dp[i - 1][1][2][2] + dp[i - 1][1][2][3];
            dp[i][0][1][3] = dp[i - 1][1][3][0] + dp[i - 1][1][3][1] + dp[i - 1][1][3][2] + dp[i - 1][1][3][3];
            dp[i][0][2][0] = dp[i - 1][2][0][0] + dp[i - 1][2][0][1] + dp[i - 1][2][0][2] + dp[i - 1][2][0][3];
            dp[i][0][2][1] = dp[i - 1][2][1][0] + dp[i - 1][2][1][1] + dp[i - 1][2][1][2] + dp[i - 1][2][1][3];
            dp[i][0][2][2] = dp[i - 1][2][2][0] + dp[i - 1][2][2][1] + dp[i - 1][2][2][2] + dp[i - 1][2][2][3];
            dp[i][0][2][3] = dp[i - 1][2][3][0] + dp[i - 1][2][3][1] + dp[i - 1][2][3][2] + dp[i - 1][2][3][3];
            dp[i][0][3][0] = dp[i - 1][3][0][0] + dp[i - 1][3][0][1] + dp[i - 1][3][0][2] + dp[i - 1][3][0][3];
            dp[i][0][3][1] = dp[i - 1][3][1][0] + dp[i - 1][3][1][1] + dp[i - 1][3][1][2] + dp[i - 1][3][1][3];
            dp[i][0][3][2] = dp[i - 1][3][2][0] + dp[i - 1][3][2][1] + dp[i - 1][3][2][2] + dp[i - 1][3][2][3];
            dp[i][0][3][3] = dp[i - 1][3][3][0] + dp[i - 1][3][3][1] + dp[i - 1][3][3][2] + dp[i - 1][3][3][3];

            dp[i][1][0][0] = dp[i - 1][0][0][0] + dp[i - 1][0][0][1] + dp[i - 1][0][0][2] + dp[i - 1][0][0][3];
            dp[i][1][0][1] = dp[i - 1][0][1][0] + dp[i - 1][0][1][1] + dp[i - 1][0][1][2] + dp[i - 1][0][1][3];
            dp[i][1][0][2] = dp[i - 1][0][2][0] + dp[i - 1][0][2][1] + dp[i - 1][0][2][2] + dp[i - 1][0][2][3];
            dp[i][1][0][3] = dp[i - 1][0][3][0] + dp[i - 1][0][3][1] + dp[i - 1][0][3][2] + dp[i - 1][0][3][3];
            dp[i][1][1][0] = dp[i - 1][1][0][0] + dp[i - 1][1][0][1] + dp[i - 1][1][0][2] + dp[i - 1][1][0][3];
            dp[i][1][1][1] = dp[i - 1][1][1][0] + dp[i - 1][1][1][1] + dp[i - 1][1][1][2] + dp[i - 1][1][1][3];
            dp[i][1][1][2] = dp[i - 1][1][2][0] + dp[i - 1][1][2][1] + dp[i - 1][1][2][2] + dp[i - 1][1][2][3];
            dp[i][1][1][3] = dp[i - 1][1][3][0] + dp[i - 1][1][3][1] + dp[i - 1][1][3][2] + dp[i - 1][1][3][3];
            dp[i][1][2][0] = 0;
            dp[i][1][2][1] = dp[i - 1][2][1][0] + dp[i - 1][2][1][1] + dp[i - 1][2][1][2] + dp[i - 1][2][1][3];
            dp[i][1][2][2] = dp[i - 1][2][2][0] + dp[i - 1][2][2][1] + dp[i - 1][2][2][2] + dp[i - 1][2][2][3];
            dp[i][1][2][3] = dp[i - 1][2][3][0] + dp[i - 1][2][3][1] + dp[i - 1][2][3][2] + dp[i - 1][2][3][3];
            dp[i][1][3][0] = dp[i - 1][3][0][0] + dp[i - 1][3][0][1] + dp[i - 1][3][0][2] + dp[i - 1][3][0][3];
            dp[i][1][3][1] = dp[i - 1][3][1][0] + dp[i - 1][3][1][1] + dp[i - 1][3][1][2] + dp[i - 1][3][1][3];
            dp[i][1][3][2] = dp[i - 1][3][2][0] + dp[i - 1][3][2][1] + dp[i - 1][3][2][2] + dp[i - 1][3][2][3];
            dp[i][1][3][3] = dp[i - 1][3][3][0] + dp[i - 1][3][3][1] + dp[i - 1][3][3][2] + dp[i - 1][3][3][3];

            dp[i][2][0][0] = dp[i - 1][0][0][0] + dp[i - 1][0][0][1] + dp[i - 1][0][0][2] + dp[i - 1][0][0][3];
            dp[i][2][0][1] = 0;
            dp[i][2][0][2] = dp[i - 1][0][2][0] + dp[i - 1][0][2][1] + dp[i - 1][0][2][2] + dp[i - 1][0][2][3];
            dp[i][2][0][3] = dp[i - 1][0][3][0] + dp[i - 1][0][3][1] + dp[i - 1][0][3][2] + dp[i - 1][0][3][3];
            dp[i][2][1][0] = 0;
            dp[i][2][1][1] = dp[i - 1][1][1][1] + dp[i - 1][1][1][2] + dp[i - 1][1][1][3];
            dp[i][2][1][2] = dp[i - 1][1][2][1] + dp[i - 1][1][2][2] + dp[i - 1][1][2][3];
            dp[i][2][1][3] = dp[i - 1][1][3][1] + dp[i - 1][1][3][2] + dp[i - 1][1][3][3];
            dp[i][2][2][0] = dp[i - 1][2][0][0] + dp[i - 1][2][0][1] + dp[i - 1][2][0][2] + dp[i - 1][2][0][3];
            dp[i][2][2][1] = dp[i - 1][2][1][1] + dp[i - 1][2][1][2] + dp[i - 1][2][1][3];
            dp[i][2][2][2] = dp[i - 1][2][2][0] + dp[i - 1][2][2][1] + dp[i - 1][2][2][2] + dp[i - 1][2][2][3];
            dp[i][2][2][3] = dp[i - 1][2][3][0] + dp[i - 1][2][3][1] + dp[i - 1][2][3][2] + dp[i - 1][2][3][3];
            dp[i][2][3][0] = dp[i - 1][3][0][0] + dp[i - 1][3][0][1] + dp[i - 1][3][0][2] + dp[i - 1][3][0][3];
            dp[i][2][3][1] = dp[i - 1][3][1][1] + dp[i - 1][3][1][2] + dp[i - 1][3][1][3];
            dp[i][2][3][2] = dp[i - 1][3][2][0] + dp[i - 1][3][2][1] + dp[i - 1][3][2][2] + dp[i - 1][3][2][3];
            dp[i][2][3][3] = dp[i - 1][3][3][0] + dp[i - 1][3][3][1] + dp[i - 1][3][3][2] + dp[i - 1][3][3][3];

            dp[i][3][0][0] = dp[i - 1][0][0][0] + dp[i - 1][0][0][1] + dp[i - 1][0][0][2] + dp[i - 1][0][0][3];
            dp[i][3][0][1] = dp[i - 1][0][1][0] + dp[i - 1][0][1][1] + dp[i - 1][0][1][2] + dp[i - 1][0][1][3];
            dp[i][3][0][2] = dp[i - 1][0][2][0] + dp[i - 1][0][2][1] + dp[i - 1][0][2][2] + dp[i - 1][0][2][3];
            dp[i][3][0][3] = dp[i - 1][0][3][0] + dp[i - 1][0][3][1] + dp[i - 1][0][3][2] + dp[i - 1][0][3][3];
            dp[i][3][1][0] = dp[i - 1][1][0][0] + dp[i - 1][1][0][1] + dp[i - 1][1][0][2] + dp[i - 1][1][0][3];
            dp[i][3][1][1] = dp[i - 1][1][1][0] + dp[i - 1][1][1][1] + dp[i - 1][1][1][2] + dp[i - 1][1][1][3];
            dp[i][3][1][2] = dp[i - 1][1][2][0] + dp[i - 1][1][2][1] + dp[i - 1][1][2][2] + dp[i - 1][1][2][3];
            dp[i][3][1][3] = dp[i - 1][1][3][0] + dp[i - 1][1][3][1] + dp[i - 1][1][3][2] + dp[i - 1][1][3][3];
            dp[i][3][2][0] = dp[i - 1][2][0][0] + dp[i - 1][2][0][1] + dp[i - 1][2][0][2] + dp[i - 1][2][0][3];
            dp[i][3][2][1] = dp[i - 1][2][1][0] + dp[i - 1][2][1][1] + dp[i - 1][2][1][2] + dp[i - 1][2][1][3];
            dp[i][3][2][2] = dp[i - 1][2][2][0] + dp[i - 1][2][2][1] + dp[i - 1][2][2][2] + dp[i - 1][2][2][3];
            dp[i][3][2][3] = dp[i - 1][2][3][0] + dp[i - 1][2][3][1] + dp[i - 1][2][3][2] + dp[i - 1][2][3][3];
            dp[i][3][3][0] = dp[i - 1][3][0][0] + dp[i - 1][3][0][1] + dp[i - 1][3][0][2] + dp[i - 1][3][0][3];
            dp[i][3][3][1] = dp[i - 1][3][1][0] + dp[i - 1][3][1][1] + dp[i - 1][3][1][2] + dp[i - 1][3][1][3];
            dp[i][3][3][2] = dp[i - 1][3][2][0] + dp[i - 1][3][2][1] + dp[i - 1][3][2][2] + dp[i - 1][3][2][3];
            dp[i][3][3][3] = dp[i - 1][3][3][0] + dp[i - 1][3][3][1] + dp[i - 1][3][3][2] + dp[i - 1][3][3][3];
        }
        Console.WriteLine(
            dp[N][0][0][0] +
            dp[N][0][0][1] +
            dp[N][0][0][2] +
            dp[N][0][0][3] +
            dp[N][0][1][0] +
            dp[N][0][1][1] +
            dp[N][0][1][2] +
            dp[N][0][1][3] +
            dp[N][0][2][0] +
            dp[N][0][2][1] +
            dp[N][0][2][2] +
            dp[N][0][2][3] +
            dp[N][0][3][0] +
            dp[N][0][3][1] +
            dp[N][0][3][2] +
            dp[N][0][3][3] +

            dp[N][1][0][0] +
            dp[N][1][0][1] +
            dp[N][1][0][2] +
            dp[N][1][0][3] +
            dp[N][1][1][0] +
            dp[N][1][1][1] +
            dp[N][1][1][2] +
            dp[N][1][1][3] +
            dp[N][1][2][0] +
            dp[N][1][2][1] +
            dp[N][1][2][2] +
            dp[N][1][2][3] +
            dp[N][1][3][0] +
            dp[N][1][3][1] +
            dp[N][1][3][2] +
            dp[N][1][3][3] +

            dp[N][2][0][0] +
            dp[N][2][0][1] +
            dp[N][2][0][2] +
            dp[N][2][0][3] +
            dp[N][2][1][0] +
            dp[N][2][1][1] +
            dp[N][2][1][2] +
            dp[N][2][1][3] +
            dp[N][2][2][0] +
            dp[N][2][2][1] +
            dp[N][2][2][2] +
            dp[N][2][2][3] +
            dp[N][2][3][0] +
            dp[N][2][3][1] +
            dp[N][2][3][2] +
            dp[N][2][3][3] +

            dp[N][3][0][0] +
            dp[N][3][0][1] +
            dp[N][3][0][2] +
            dp[N][3][0][3] +
            dp[N][3][1][0] +
            dp[N][3][1][1] +
            dp[N][3][1][2] +
            dp[N][3][1][3] +
            dp[N][3][2][0] +
            dp[N][3][2][1] +
            dp[N][3][2][2] +
            dp[N][3][2][3] +
            dp[N][3][3][0] +
            dp[N][3][3][1] +
            dp[N][3][3][2] +
            dp[N][3][3][3]
            );
    }