private static int[] Complement(ILexoNumeralSystem sys, int[] mag, int digits) { if (digits <= 0) { throw new LexoException("Expected at least 1 digit"); } var nmag = new int[digits]; nmag.Fill(sys.GetBase() - 1); for (var i = 0; i < mag.Length; ++i) { nmag[i] = sys.GetBase() - 1 - mag[i]; } return(nmag); }
private static int[] Multiply(ILexoNumeralSystem sys, int[] l, int[] r) { var result = new int[l.Length + r.Length]; for (var li = 0; li < l.Length; ++li) { for (var ri = 0; ri < r.Length; ++ri) { var resultIndex = li + ri; for (result[resultIndex] += l[li] * r[ri]; result[resultIndex] >= sys.GetBase(); result[resultIndex] -= sys.GetBase()) { ++result[resultIndex + 1]; } } } return(result); }
private static int[] Add(ILexoNumeralSystem sys, IReadOnlyList <int> l, IReadOnlyList <int> r) { var estimatedSize = Math.Max(l.Count, r.Count); var result = new int[estimatedSize]; var carry = 0; for (var i = 0; i < estimatedSize; ++i) { var lNum = i < l.Count ? l[i] : 0; var rNum = i < r.Count ? r[i] : 0; var sum = lNum + rNum + carry; for (carry = 0; sum >= sys.GetBase(); sum -= sys.GetBase()) { ++carry; } result[i] = sum; } return(ExtendWithCarry(result, carry)); }
public static LexoDecimal Half(ILexoNumeralSystem sys) { var mid = sys.GetBase() / 2; return(Make(LexoInteger.Make(sys, 1, new[] { mid }), 1)); }