Exemple #1
0
        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);
        }
Exemple #2
0
        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);
        }
Exemple #3
0
        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));
        }