Как я могу делать mod без оператора mod?

Этот глупый язык сценариев не имеет% или Mod(). У меня есть Fix(), который отбивает десятичную часть числа. Мне нужны только положительные результаты, поэтому не становитесь слишком надежными.

Ответ 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;
}