Этот глупый язык сценариев не имеет% или Mod(). У меня есть Fix(), который отбивает десятичную часть числа. Мне нужны только положительные результаты, поэтому не становитесь слишком надежными.
Как я могу делать mod без оператора mod?
Ответ 1
Будет
// mod = a % b
c = Fix(a / b)
mod = a - b * c
делать? Я предполагаю, что вы можете по крайней мере делить здесь. Все ставки отключены на отрицательных числах.
Ответ 2
a mod n = a - (n * Fix(a/n))
Ответ 3
Для потомков BrightScript теперь имеет оператор modulo, он выглядит так:
c = a mod b
Ответ 4
На каком языке?
Базовый алгоритм может быть:
hold the modulo in a variable (modulo);
hold the target number in a variable (target);
initialize modulus variable;
while (target > 0) {
if (target > modulo) {
target -= modulo;
}
else if(target < modulo) {
modulus = target;
break;
}
}
Ответ 5
Если кто-то прибывает позже, вот еще несколько актуальных алгоритмов (с ошибками... читайте внимательно)
https://eprint.iacr.org/2014/755.pdf
На самом деле существуют два основных вида формул сокращения: Баретт и Монтгомери. Бумага от eprint повторяется как в разных версиях (алгоритмы 1-3), так и дает "улучшенную" версию в алгоритме 4.
Обзор
Теперь я даю обзор алгоритма 4.
1.) Вычислите "A * B" и сохраните весь продукт в "C", чтобы C и модуль $p $были введены для этого алгоритма.
2.) Вычислить длину бит $p $, скажем: функция "Ширина (p)" возвращает именно это значение.
3.) Разделите входные $C $на N "блоки" размера "Width (p)" и сохраните каждый в G. Начните с G [0] = lsb (p) и закончите в G [N-1 ] = msb (p). (Описание действительно не соответствует действительности)
4.) Запустите цикл while: Установите N = N-1 (чтобы добраться до последнего элемента) precompute $b: = 2 ^ {Ширина (p)}\bmod p $
while N>0 do:
T = G[N]
for(i=0; i<Width(p); i++) do: //Note: that counter doesn't matter, it limits the loop)
T = T << 1 //leftshift by 1 bit
while is_set( bit( T, Width(p) ) ) do // (N+1)-th bit of T is 1
unset( bit( T, Width(p) ) ) // unset the (N+1)-th bit of T (==0)
T += b
endwhile
endfor
G[N-1] += T
while is_set( bit( G[N-1], Width(p) ) ) do
unset( bit( G[N-1], Width(p) ) )
G[N-1] += b
endwhile
N -= 1
endwhile
Это много. Нам не нужно только рекурсивно уменьшать G [0]:
while G[0] > p do
G[0] -= p
endwhile
return G[0]// = C mod p
Остальные три алгоритма хорошо определены, но в этом отсутствует какая-то информация или это действительно неправильно. Но он работает для любого размера;)
Ответ 6
Это может не работать для вас по производительности, но:
while (num >= mod_limit)
num = num - mod_limit
Ответ 7
В javascript:
function modulo(num1, num2) {
if (num2 === 0 || isNaN(num1) || isNaN(num2)) {
return NaN;
}
if (num1 === 0) {
return 0;
}
var remainderIsPositive = num1 >= 0;
num1 = Math.abs(num1);
num2 = Math.abs(num2);
while (num1 >= num2) {
num1 -= num2
}
return remainderIsPositive ? num1 : 0 - num1;
}