Помогите исправить ошибку Overflow
Dim a As Double
Dim c As Double
Dim b As Double
a = Text1.Text
c = 2 ^ a
b = c Mod 989
Text2.Text = c
Text3.Text = b
End Sub
Выдает ошибку overflow !
Задача типа 2^(154) mod 989 = 1
Где 'а' Степень (154) подставляется в диапазоне от 1 до 6112
Как написать программу для такой задачки ?
2^a, по-ходу, не влазит в диапазон Double.
А что можешь посоветовать тогда вместо типа данных Double ?
Максимум на что можно рассчитывать, это Decimal, у которого MaxValue - 79228162514264337593543950335, т.е. 29 знаков в десятичной записи.
Если вам действительно нужна арифметика больших чисел, используйте для этого сторонние библиотеки.
На фига там длинная математика?!!!
Сказано же - интересует результат - ПО МОДУЛЮ!!!
Я Басик не знаю, так что код набросать не могу, но в простейшем варианте - цикл из 154 (умножение + взятие по модулю)...
Кстати, ответ для 154 - 1, для 6012 - 64...
Попытался вспомнить уроки 30-летней давности, что-то вроде (не знаю, как там у вас по модулю, то бишь остаток... - написал MOD...)
FOR I = 1 TO A
RES = RES * 2 MOD 989
NEXT I
явно указано, 2 ^ (154), откуда тут берётся цикл в 154 итерации?
явно указано, 2 ^ (154), откуда тут берётся цикл в 154 итерации?
(a * b) mod c = ((a mod c) * (b mod c)) mod c
Кстати, насколько я понимаю, у умножения и операции взятия остатка приоритет одинаков.
FOR I = 1 TO A
RES = (RES * 2) MOD 989
NEXT I
явно указано, 2 ^ (154), откуда тут берётся цикл в 154 итерации?
Чтоб переполнения избежать.
Само собой, просто, как я уже говорил - Басика не помню совершенно, как там int указать, не знаю.
И - раз приоритет умножения и остатка одинаков, то скобка там как раз и не нужна :) - они же левоассоциативные операции.
Да конечно, можно и так, можно (раз это конкретно двойка) и еще проще - десятками и сотнями...
Только для таких микрочисел - до 6000 - смысла не имеет...
Ниже было следующий комментарий:
В одном случае возведение в степень, в другом - умножение. Я понимаю, что a возвести в степень n, это значит a умножить n раз на a. Но почему в процессе умножения можно ещё и брать значение по модулю, при этом ответ должен быть верным - не понимаю, так как мне представляется это двумя разными задачами.
Ну если 2^n = 989* m + r, то очевидно, что 2^n mod 989 = r, а 2^(n+1) = 2*989*m+2*r, так что 2^(n+1) mod 989 = (2*r) mod 989...
Так что по индукции, можно считать, корректность алгоритма доказана. Инвариант цикла - после k-й итерации полученное значение представляет собой 2^k mod 989. Начальное - для 0 - очевидно (2^0 есть 1 что по модулю, что без модуля...), индуктивный переход доказан выше.
Более просто - ну, затрудняюсь даже, как пояснить еще проще...