Мне нужно реализовать метод для нахождения целочисленного квадрата - root целого числа.
Моя платформа - это язык Solidity, где поддерживается только целочисленное арифметическое c и размер iput 256 бит (uint256
).
Типичным решением является бинарный поиск, который я легко реализовал.
Проблема в том, что мой метод ограничен вводом, меньшим 2 ^ 129.
Вот мой метод (реализованный в Python):
def sqrt(x):
assert(x < 0x200000000000000000000000000000000);
lo = 0;
hi = x;
while (True):
mid = (lo+hi)//2;
if (mid == lo or mid**2 == x):
return mid;
elif (mid**2 < x):
lo = mid;
else: # (mid**2 > x)
hi = mid;
Обратите внимание, что я разместил его в Python, а не в Solidity, потому что большинство пользователей здесь не знаком с Solidity, поэтому я подумал, что Python будет хорошим выбором, чтобы позволить другим легко применять изменения в моем методе.
Тем не менее, меня обычно интересует решение алгоритми c.