Оптимизация класса для длинной арифметики - C#
Формулировка задачи:
Решил написать класс для работы с ОООЧЕНЬ длинными числами
Какая была концепция :
1 - Числа дробные
2 - Числа хранятся в виде массива ulong[]
3 - Числа могут иметь любую систему счисления в пределах uint (2 - 4294967295)
4 - Знак числа хранится в отдельной переменной и имеет значения -1, 0, 1
=============================================
После написания этого класса у меня появились некоторые вопросы :
1 - Длина машинного слова 64 бита. И не зависимо от длины числа, одна операция выполняется определенное количество времени. По этому выгоднее всего проводить операции при максимальном значении системы счисления - ulong. Но при умножении максимального значения ulong получится значение, из-за которого вылетит исключение. По этому максимальная система счисления равна sqrt(ulong.MaxValue) = uint.MaxValue.
Можно ли как то обойти это ограничение и использовать большую систему счисления?
2 - Код сложения выглядит, как просто сложение всех элементов 2ух массивов. По этому эту операцию можно распараллелить. Как вы на это смотрите?
3 - Безумная идея. Т.к. максимальная длина массива, хранящего число, равна 2^31-1, то максимальное значение хранимого числа равна (2^32)^(2^31-1). Но что, если я создам второй класс, который для хранения числа будет использовать не ulong[], а массив прошлых классов, то тогда максимальное значение будет равно (2^32)^(2^31-1)^(2^31-1)? Чисто теоретически. И возможно ли на .Net создать класс для длинной арифметики, который не будет иметь ограничений? (не считая физических)
Решение задачи: «Оптимизация класса для длинной арифметики»
textual
Листинг программы
ulong[][] Vectors = EquateVectors(BN1, BN2); ulong[] Result = new ulong[Vectors[0].Length + 1]; for (int i = 0; i < Vectors[0].Length; i++) { Result[i] = Vectors[0][i] + Vectors[1][i]; } for (int i = 0; i < Result.Length - 1; i++) { if (Result[i] >= BN1.CountSystem) { Result[i + 1] += Result[i] / BN1.CountSystem; Result[i] = Result[i] % BN1.CountSystem; } } return Result;
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д