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); }
public static Kou operator*(int v, Kou k1) { Kou ret = k1.Clone(); ret.keisu *= v; return(ret); }
public Kou Clone() { Kou ret = new Kou(); ret.keisu = this.keisu; System.Array.Copy(this.inshi, ret.inshi, 7); return(ret); }
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]); }
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]); }
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); }
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); } }
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); }