Beispiel #1
0
        public void AddKou(Kou kou)
        {
            if (kou.keisu == 0)
            {
                return;
            }

            Kou removee;

            foreach (Kou k in this.list)
            {
                if (kou.InshiCode == k.InshiCode)
                {
                    k.keisu += kou.keisu;
                    if (k.keisu == 0)
                    {
                        removee = k;
                        goto remove;
                    }
                    return;
                }
            }
            this.list.Add(kou.Clone());
            return;

remove:
            this.list.Remove(removee);
        }
Beispiel #2
0
        public static Kou operator*(int v, Kou k1)
        {
            Kou ret = k1.Clone();

            ret.keisu *= v;
            return(ret);
        }
Beispiel #3
0
        public Kou Clone()
        {
            Kou ret = new Kou();

            ret.keisu = this.keisu;
            System.Array.Copy(this.inshi, ret.inshi, 7);

            return(ret);
        }
Beispiel #4
0
 private bool Normalize_check13(Kou k1, Kou k3)
 {
     return(k1.inshi[0] == k3.inshi[0] &&
            k1.inshi[1] - 2 == k3.inshi[1] &&
            k1.inshi[2] == k3.inshi[2] &&
            k1.inshi[3] + 2 == k3.inshi[3] &&
            k1.inshi[4] == k3.inshi[4] &&
            k1.inshi[5] == k3.inshi[5] &&
            k1.inshi[6] == k3.inshi[6]);
 }
Beispiel #5
0
 private bool Normalize_check12(Kou k1, Kou k2)
 {
     return(k1.inshi[0] == k2.inshi[0] &&
            k1.inshi[1] - 2 == k2.inshi[1] &&
            k1.inshi[2] + 2 == k2.inshi[2] &&
            k1.inshi[3] == k2.inshi[3] &&
            k1.inshi[4] == k2.inshi[4] &&
            k1.inshi[5] == k2.inshi[5] &&
            k1.inshi[6] == k2.inshi[6]);
 }
Beispiel #6
0
        public static Kou operator*(Kou k1, Kou k2)
        {
            Kou ret = new Kou();

            ret.keisu = k1.keisu * k2.keisu;
            for (int i = 0; i < 7; i++)
            {
                ret.inshi[i] = k1.inshi[i] + k2.inshi[i];
            }

            return(ret);
        }
Beispiel #7
0
        public void _Normalize()
        {
            Kou k1;

            foreach (Kou k in this.list)
            {
                if (k.inshi[1] >= 2)
                {
                    k1 = k;
                    goto norm;
                }
            }
            return;

norm:
            Kou k2 = null;
            Kou k3 = null;

            foreach (Kou k in this.list)
            {
                if (Normalize_check12(k1, k))
                {
                    k2 = k;
                }
                else if (Normalize_check13(k1, k))
                {
                    k3 = k;
                }
            }
            if (k2 != null && k3 != null)
            {
                this.list.Remove(k1);
                this.list.Remove(k2);
                this.list.Remove(k3);
                k1.inshi[1] -= 2;
                k1.inshi[0] -= 2;
                this.AddKou(k1);
            }
            else
            {
                this.list.Remove(k1);
                this.Normalize();
                this.list.Add(k1);
            }
        }
Beispiel #8
0
        public void Henbi(Shiki shiki, int index)
        {
            if (index <= 0 || 6 < index)
            {
                throw new System.Exception("そんな偏微分には対応していないよ");
            }

            Kou ret = this.Clone();

            ret.keisu *= ret.inshi[index]--;
            shiki.AddKou(ret);

            if (index > 3 || this.inshi[0] == 0)
            {
                return;
            }

            ret           = this.Clone();
            ret.keisu    *= -ret.inshi[0];
            ret.inshi[0] += 2;
            ret.inshi[index]++;
            shiki.AddKou(ret);
        }