Як комп’ютери можуть обчислювати експоненціальну математику без помилок переповнення?


32

Вивчаючи деякі методи шифрування / дешифрування RSA, я знайшов цю статтю: Приклад алгоритму RSA

Це вимагає, щоб розшифрувати це повідомлення введіть тут опис зображення

Загальний результат введіть тут опис зображеннянастільки великий, для 64-бітної / 32-бітної машини, я не вірю, що він може мати таке велике значення в одному реєстрі. Як комп’ютер робить це без переливу?


Це питання було питанням суперкористувача тижня .
Прочитайте запис у блозі для отримання більш детальної інформації або допишіть до себе


6
Цікаво, чи отримаєте ви кращу відповідь, якби це перейшло на cs.stackexchange.com. Це здається, що це може краще поміститися на сайті CS / Math, який набагато більше орієнтований на фактичні деталі низьких речей, які знижуються на дуже низькому рівні.
Zoredache

1
Це досить дійсно для Super User.
Джеймс Мерц

Відповіді:


40

Оскільки операція з цілим модулем - це кільцевий гомоморфізм ( Вікіпедія ) від ℤ -> ℤ / nℤ,

(X * Y) mod N = (X mod N) * (Y mod N) mod N

Ви можете перевірити це самостійно за допомогою трохи простої алгебри. (Зверніть увагу, що фінал modправоруч з'являється завдяки визначенню множення в модульному кільці.)

Комп'ютери використовують цей трюк для обчислення експонентів у модульних кільцях без необхідності обчислення великої кількості цифр.

               / 1 I = 0,
               |
(X ^ I) mod N = <(X * (X ^ (I-1) mod N)) mod NI непарне,
               |
               \ (X ^ (I / 2) mod N) ^ 2 мод NI навіть & I / = 0.

В алгоритмічній формі

-- compute X^I mod N
function expmod(X, I, N)
    if I is zero
        return 1
    elif I is odd
        return (expmod(X, I-1, N) * X) mod N
    else
        Y <- expmod(X, I/2, N)
        return (Y*Y) mod N
    end if
end function

Ви можете використовувати це для обчислення (855^2753) mod 3233лише 16-бітових регістрів, якщо вам це подобається.

Однак значення X і N в RSA набагато більші, занадто великі, щоб вписатись у регістр. Модуль, як правило, становить 1024-4096 біт! Таким чином, ви можете мати комп'ютер, який виконує множення "довгим шляхом", так само, як ми робимо множення вручну. Тільки замість цифр 0-9 комп'ютер використовуватиме "слова" 0-2 16 -1 або щось подібне. (Використовуючи лише 16 біт, це означає, що ми можемо помножити два 16-бітові числа та отримати повний 32-бітний результат, не вдаючись до мови складання. У мові складання зазвичай дуже просто отримати повний 64-бітний результат або для 64-розрядного комп'ютера , повний 128-розрядний результат.)

-- Multiply two bigints by each other
function mul(uint16 X[N], uint16 Y[N]):
    Z <- new array uint16[N*2]
    for I in 1..N
        -- C is the "carry"
        C <- 0
        -- Add Y[1..N] * X[I] to Z
        for J in 1..N
            T <- X[I] * Y[J] + C + Z[I + J - 1]
            Z[I + J - 1] <- T & 0xffff
            C <- T >> 16
        end
        -- Keep adding the "carry"
        for J in (I+N)..(N*2)
            T <- C + Z[J]
            Z[J] <- T & 0xffff
            C <- T >> 16
        end
    end
    return Z
end
-- footnote: I wrote this off the top of my head
-- so, who knows what kind of errors it might have

Це помножить X на Y на кількість часу, що приблизно дорівнює кількості слів у X, помноженій на кількість слів у Y. Це називається часом O (N 2 ). Якщо ви подивитеся на алгоритм вище та розімніть його, це те саме «довге множення», яке вони навчають у школі. У вас немає разів запам’ятовувати таблиці на 10 цифр, але ви все одно можете перемножувати 1,926,348 x 8,192,004, якщо сісти і опрацювати.

Довге множення:

    1,234
  x 5,678
---------
    9,872
   86,38
  740,4
6,170
---------
7,006,652

Насправді існує кілька швидших алгоритмів для множення ( Вікіпедія ), наприклад, швидкий метод Фур'є Страссена та деякі більш прості методи, які роблять додаткове додавання і віднімання, але менше множення, і так в кінцевому підсумку швидше. Числові бібліотеки, такі як GMP, здатні вибирати різні алгоритми залежно від того, наскільки великі числа: перетворення Фур'є є лише найшвидшим для найбільших чисел, менші числа використовують більш прості алгоритми.


+1, але ви не вистачаєте додаткового mod Nв кінці теоретики китайського залишку. ( (16 mod 5)не дорівнює (4 mod 5) * (4 mod 5): перший - 1, другий - 16.)
ruakh

@ruakh: Виправлено. Хоча я дуже хочу сказати, R / kR є ізоморфним для R / k1R x R / k2R x ... R / knR, де k1..kn є парним копрімесом, їхній продукт k, а R - головний ідеальний домен. Я так довго перевантажував *, що важко сприймати його як що-небудь, крім модульного. Іншими словами, за моїми звичайними умовними умовними умовами modце зайве.
Дітріх Епп

1
@Synetech: Але я так люблю ці чотири слова: "Вправа для читача".
Дітріх Епп

1
(X * Y) mod N = (X mod N) * (Y mod N) mod Nце правда, але це не має нічого спільного з китайською теоремою залишків.
Денніс

1
@Dennis: Я зараз уточнив структуру кодомейна у відповіді. (Для мене це ніколи не є неоднозначним, оскільки я це написав ...)
Дітріх Епп

9

Відповідь проста: вони не можуть, не самостійно. Дійсно, якщо взяти концепцію x-бітової машини, то існує обмежена кількість чисел, які можуть бути представлені обмеженою кількістю бітів, як і обмежена кількість чисел, яка може бути представлена ​​двома цифрами в десяткова система.

Як сказано, комп’ютерне представлення дуже великої кількості є важливою складовою сфери криптографії. Існує багато способів представлення дуже великої кількості в комп'ютері, кожен настільки ж різноманітний, як і наступний.

Кожен з цих методів має різні переваги та недоліки, і хоча я не можу / не можу тут перерахувати всі методи, я наведу дуже просто один.

Припустимо, ціле число може містити значення лише 0-99. Як можна було зобразити число 100? Спочатку це може здатися неможливим, але це тому, що ми розглядаємо лише одну змінну. Якби я мав ціле число , зване unitsі один називається hundreds, я міг би легко уявити 100: hundreds = 1; units = 0;. Я міг би легко уявити більше число, як 9223: hundreds = 92; units = 23.

Хоча це простий метод, можна стверджувати, що він дуже неефективний. Як і більшість алгоритмів, які розсувають межі того, що може зробити комп’ютер, зазвичай це буксир між потужністю (представляють велику кількість) та ефективністю (швидке пошуку / зберігання). Як я вже говорив раніше, існує багато способів представлення великої кількості в комп’ютерах; просто знайдіть метод і експериментуйте з ним!

Я сподіваюся, що це відповіло на ваше запитання!

Подальше читання:Ця стаття та ця може бути корисною для отримання додаткової інформації.


3

Шлях, який це можна зробити (є набагато швидші способи, що включають повторне квадратування тощо), шляхом множення і після кожного множення приймають модуль. Поки модуль у квадраті менше 2 ^ 32 (або 2 ^ 64), це ніколи не матиме переповнення.


3

Так само, як і ви.

Я здогадуюсь, що ти не знаєш напевно, що таке 342 * 189. Але ви знаєте такі факти:

9 * 2 = 18
9 * 4 = 36
9 * 3 = 27
8 * 2 = 16
8 * 4 = 32
8 * 3 = 24
1 * 2 = 2
1 * 4 = 4
1 * 3 = 3

18 + 360 + 2700 + 160 + 3200 + 24000 + 200 + 4000 + 30000 = 64638

Знаючи ці прості факти та навчившись технікою маніпулювати ними, ви можете робити арифметику, яку ви інакше не могли.

Таким же чином, комп’ютер, який не може обробити більше 64 біт математики за один раз, може легко розбити більші проблеми на більш дрібні шматочки, зробити ті менші шматочки та зібрати їх назад, щоб сформувати відповідь на більші, раніше невимовна проблема.


0

Що стосується додавання та віднімання, у багатьох процесорів є "біт переносу", який встановлюється, якщо арифметична операція переповнилася. Отже, якщо для результату буде потрібно 8 байт для зберігання, а процесор 32-бітний (що дорівнює 4 8-бітовим байтам), він може зробити дві операції додавання, спочатку на "низьке слово", а потім на "високе слово" з долоткою для переносу, що піклується про перелив. Необхідно спочатку очистити долото. Це одна з причин, чому більш високі бітові процесори підвищують продуктивність, оскільки цього не потрібно робити так сильно.

Звичайно, це з мого обмеженого досвіду асемблера з 8-бітними процесорами. Я не знаю, як працює біт для перенесення з сучасними процесорами з інструкціями множення та діді. Процесори, що не входять до Intel RISC, також можуть поводитися по-різному.

Я мало знаю про математику з плаваючою комою, але в основному байти представляють фіксовану кількість місць, але не конкретні місця. Ось чому його називають "плаваючою" точкою. Так, наприклад, число 34459234 займало б приблизно такий самий простір пам'яті, як 3,4459234, або 3,4459234E + 20 (це 3,4459234 x 10 ^ 20).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.