public override MMC.Numbers.CNumber sqr() { int cnt = _Values.Count; // calc the different interims (could be done in parallel) CNumber_Integer[] Results = new CNumber_Integer[cnt]; for (int i = 0; i < cnt; ++i) { CNumber_Integer tmp = new CNumber_Integer(this); tmp.Multiply(_Values[i]); tmp._Values.InsertRange(0, new byte[i]); Results[i] = tmp; } // now add them all up CNumber_Integer res = new CNumber_Integer(Results[0]); for (int i = 1; i < cnt; i++) { res.Addition(Results[i]); } res.Trim(); return(res); }
public override MMC.Numbers.CNumber sub(MMC.Numbers.CNumber other) { if (other.MyType != MyType) { throw new NotImplementedException(); } CNumber_Integer res = new CNumber_Integer(this); if (_Sign != ((CNumber_Integer)other)._Sign) { res.Addition((CNumber_Integer)other); } else { res.Subtraction((CNumber_Integer)other); } return(res); }
// written multiplication public override MMC.Numbers.CNumber mul(MMC.Numbers.CNumber other) { if (other.MyType != MyType) { throw new NotImplementedException(); } CNumber_Integer o = (CNumber_Integer)other; int cnt = o._Values.Count; // calc the different interims (could be done in parallel) CNumber_Integer[] Results = new CNumber_Integer[cnt]; for (int i = 0; i < cnt; i++) { CNumber_Integer tmp = new CNumber_Integer(this); tmp.Multiply(o._Values[i]); tmp._Values.InsertRange(0, new byte[i]); Results[i] = tmp; } // now add them all up CNumber_Integer res = new CNumber_Integer(Results[0]); for (int i = 1; i < cnt; i++) { res.Addition(Results[i]); } //CNumber_Integer mul = (CNumber_Integer)other; //for (int i = mul._Values.Count - 1; i >= 0; i--) //{ // CNumber_Integer tmp = (CNumber_Integer) Clone(); // tmp.Multiply(mul._Values[i]); // res.Insert(0); // res.Addition(tmp); //} res._Sign = (_Sign != o._Sign); res.Trim(); return(res); }