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); }
//------------------------------------------------------------ // logical functions public override CNumber not() { CNumber_Integer res = new CNumber_Integer(this); res.Not(); res.Trim(); return(res); }
public override CNumber xor(CNumber other) { if (other.MyType != MyType) { throw new NotImplementedException(); } CNumber_Integer res = new CNumber_Integer(this); CNumber_Integer o = (CNumber_Integer)other; int o_len = o._Values.Count; // the other length int t_len = _Values.Count; // our own length int len = (t_len < o_len) ? t_len : o_len; // calc the minimum length int i = 0; // start with the lowest digit for (; i < len; i++) // first handle the common digits { res._Values[i] ^= o._Values[i]; } res.Trim(); 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); }