public static ILongNumber DivisionLongInteger(LongInteger v1, LongInteger v2) { ILongNumber result = Module(v1); var modulo = Module(v2); var resultIsNegative = v1.IsNegative() != v2.IsNegative(); if (v2.Values.Count == 1) { result = DivisionIntoSmall(result as LongInteger, v2.Values[0]); } else { var low = 0; var up = Constants.Radix; while ((up - low) > 1) { var midRange = (low + up) / 2; var res = MultiplicationLongInteger(modulo, LongInteger.Parse(Convert.ToString(midRange))); if (Compare(res, modulo) > 0) { // up = up - up/2; up = midRange; } else { // low = low + up/2; low = midRange; } } throw new NotImplementedException(); } if (resultIsNegative) { result.InverSign(); } return(result); }
public static ILongNumber DivisionIntoSmall(LongInteger v1, int v2) { if (v2 >= Constants.Radix) { var divider = LongInteger.Parse(Convert.ToString(v2)); return(DivisionLongInteger(v1, divider)); } if (v2 == 0) { return(v1.IsNegative() ? new InfinityLongNumber(true) : new InfinityLongNumber()); } var result = v1.Clone(); var modulo = 0; var i = 0; while (i < v1.Values.Count) { var res = modulo * Constants.Radix + v1.Values[i]; result.Values[i] = (res / Math.Abs(v2)); modulo = (res % Math.Abs(v2)); i++; } if (v1.Negative || v2 < 0) { result.Negative = true; } if (v1.Negative && v2 < 0) { result.Negative = false; } result.Normalize(); return(result); }