-- Линейный метод
local function method1(b, e, m)
local c = 1
for i = 1, e do
c = (c * b) % m
end
return c
end
-- Рекурсивный метод
local function method2(b, e, m)
if e == 0 then
return 1
elseif e == 1 then
return b
elseif e % 2 == 1 then
return (method2(b, e - 1, m) * b) % m
else
local x = method2(b, e / 2, m)
return (x * x) % m
end
end
-- Итеративный метод
local function method3(b, e, m)
local result = 1
b = b % m
while e > 0 do
if e % 2 == 1 then
e, result = e - 1, (result * b) % m
else
e, b = e / 2, (b * b) % m
end
end
return result
end
-- Итеративный метод с использованием бинарных операций
local function method4(b, e, m)
local result = 1
b = b % m
while e > 0 do
if e & 1 == 1 then
result = (result * b) % m
end
e, b = e >> 1, (b * b) % m
end
return result
end
local function time(iterations, method, ...)
local oldClock = os.clock()
for i = 1, iterations do
method(...)
end
print("Time: " .. string.format("%.8f", os.clock() - oldClock))
end
time(50, method1, 2, 1000000, 37)
time(50, method2, 2, 1000000, 37)
time(50, method3, 2, 1000000, 37)
time(50, method4, 2, 1000000, 37)
Ci0tINCb0LjQvdC10LnQvdGL0Lkg0LzQtdGC0L7QtApsb2NhbCBmdW5jdGlvbiBtZXRob2QxKGIsIGUsIG0pCglsb2NhbCBjID0gMQoJZm9yIGkgPSAxLCBlIGRvCgkJYyA9IChjICogYikgJSBtCgllbmQKCglyZXR1cm4gYwplbmQKCi0tINCg0LXQutGD0YDRgdC40LLQvdGL0Lkg0LzQtdGC0L7QtApsb2NhbCBmdW5jdGlvbiBtZXRob2QyKGIsIGUsIG0pCglpZiBlID09IDAgdGhlbgoJCXJldHVybiAxCgllbHNlaWYgZSA9PSAxIHRoZW4KCQlyZXR1cm4gYgoJZWxzZWlmIGUgJSAyID09IDEgdGhlbgoJCXJldHVybiAobWV0aG9kMihiLCBlIC0gMSwgbSkgKiBiKSAlIG0KCWVsc2UKCQlsb2NhbCB4ID0gbWV0aG9kMihiLCBlIC8gMiwgbSkKCQlyZXR1cm4gKHggKiB4KSAlIG0KCWVuZAplbmQKCi0tINCY0YLQtdGA0LDRgtC40LLQvdGL0Lkg0LzQtdGC0L7QtApsb2NhbCBmdW5jdGlvbiBtZXRob2QzKGIsIGUsIG0pCglsb2NhbCByZXN1bHQgPSAxCgliID0gYiAlIG0KCQoJd2hpbGUgZSA+IDAgZG8KCQlpZiBlICUgMiA9PSAxIHRoZW4KCQkJZSwgcmVzdWx0ID0gZSAtIDEsIChyZXN1bHQgKiBiKSAlIG0KCQllbHNlCgkJCWUsIGIgPSBlIC8gMiwgKGIgKiBiKSAlIG0KCQllbmQKCWVuZAogCglyZXR1cm4gcmVzdWx0CmVuZAoKLS0g0JjRgtC10YDQsNGC0LjQstC90YvQuSDQvNC10YLQvtC0INGBINC40YHQv9C+0LvRjNC30L7QstCw0L3QuNC10Lwg0LHQuNC90LDRgNC90YvRhSDQvtC/0LXRgNCw0YbQuNC5CmxvY2FsIGZ1bmN0aW9uIG1ldGhvZDQoYiwgZSwgbSkKCWxvY2FsIHJlc3VsdCA9IDEKCWIgPSBiICUgbQoJCgl3aGlsZSBlID4gMCBkbwoJCWlmIGUgJiAxID09IDEgdGhlbgoJCQlyZXN1bHQgPSAocmVzdWx0ICogYikgJSBtCQoJCWVuZAoKCQllLCBiID0gZSA+PiAxLCAoYiAqIGIpICUgbQoJZW5kCiAKCXJldHVybiByZXN1bHQKZW5kCgpsb2NhbCBmdW5jdGlvbiB0aW1lKGl0ZXJhdGlvbnMsIG1ldGhvZCwgLi4uKQoJbG9jYWwgb2xkQ2xvY2sgPSBvcy5jbG9jaygpCglmb3IgaSA9IDEsIGl0ZXJhdGlvbnMgZG8KCQltZXRob2QoLi4uKQoJZW5kCglwcmludCgiVGltZTogIiAuLiBzdHJpbmcuZm9ybWF0KCIlLjhmIiwgb3MuY2xvY2soKSAtIG9sZENsb2NrKSkKZW5kCgp0aW1lKDUwLCBtZXRob2QxLCAyLCAxMDAwMDAwLCAzNykKdGltZSg1MCwgbWV0aG9kMiwgMiwgMTAwMDAwMCwgMzcpCnRpbWUoNTAsIG1ldGhvZDMsIDIsIDEwMDAwMDAsIDM3KQp0aW1lKDUwLCBtZXRob2Q0LCAyLCAxMDAwMDAwLCAzNykK