2013-06-11 2 views
-3

Я пытаюсь создать программу на C++, который может решить модульную конгруэнтность:Наименее неотрицательный остаток: Большие номера

п^р = х (по модулю д),

где п - небольшое число, а р и q - очень большие произвольные простые числа. Я пытался сделать это несколько раз, но я всегда сталкивался с проблемами переполнения памяти. Любая помощь приветствуется.

+0

Вы не можете найти исходный код? – suspectus

+0

Возможно. Я могу проверить, все ли он дешифрован. Это займет секунду, потому что я запускаю Windows Server параллельно на Mac. – Trancot

+0

Я говорю «decipherable», потому что там, где хранится код, это один из многих блоков несвязанного кода, все закомментированные в основном. Это потому, что это всего лишь тестовый файл .cpp, поэтому у меня есть куча прокомментированных программ в одном файле .cpp. Имеет ли это смысл? – Trancot

ответ

2

Существует простой алгоритм б^е (мод м):

function powerMod(b, e, m) 
    x := 1 
    while e > 0 
     if e % 2 == 1 
      x := (b * x) % m 
     b := (b * b) % m 
     e := e // 2 # integer division 
    return x 

Вы должны не вычислить б^е, а затем выполнить операцию по модулю , так как промежуточное число будет огромным. Я оставлю это вам, чтобы перевести на предпочтительный язык с типами данных, подходящими для хранения больших чисел, которые вам нужны. Я обсуждаю этот алгоритм на my blog.

+0

спасибо, @ пользователь448810. Это будет полезно. – Trancot

+0

Что вы подразумеваете под 'e: = e // 2 # integer division'? – Trancot

+0

без знака long long powerMod (без знака длинный длинный b, без знака длинный длинный e, без знака длинный длинный m) { \t int x = 1; \t в то время как (е> 0) \t { \t \t, если (е% 2 == 1) \t \t { \t \t \t х = (Ь * х)% м; \t \t} \t \t b = (b * b)% m; \t \t e = e – Trancot

1

Рассматривая ваши комментарии по вашему вопросу, кажется, что вы пытаетесь перебросить очень большие значения в переменные, которые не могут содержать большие значения.

Посмотрите здесь для получения дополнительной информации о типах данных и диапазонах они могут держать:
http://msdn.microsoft.com/en-us/library/s3f49ktz(v=vs.110).aspx

Самый большой диапазон типов данных я нашел с неотрицательными числами unsigned long long. Он содержит диапазон значений от 0 до 18 446 744 073 709 551 615.

+0

Будет ли это число в моей системе тем же? – Trancot

+0

Это максимальное значение для неподписанного 64-битного целого числа. (0xffffffffffffffff), который равен 18 446 744 073 709 551 615. Эти значения верны для Visual Studio 2012. Поэтому, чтобы ответить на ваш вопрос, вы не сможете использовать большие числа, как хотите, без помощи библиотеки, подобной библиотеке больших номеров, о которой упоминал Питер Вуд в комментарии раздел на ваш вопрос. Если вы используете это, решите свою проблему, пожалуйста, не забудьте оставить комментарий. – Doug

+0

Вы видели комментарий Питера Вуда? – Trancot

Смежные вопросы