2010-05-03 7 views
11

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

+2

Не могли бы вы упомянуть и, возможно, отметить, какой «глупый» язык сценариев вы говорите? –

+0

Я думаю, что это глупый язык под названием «домашняя работа» – Gareth

+1

Хех.Это встроенный язык на этом видеоплеере Roku digital signage. У него, вероятно, есть Mod где-то, но я уверен, что не могу его найти, и он похож на Arctan() и NaturalLog(), поэтому я действительно запутался в том, как они пропустили Mod. – tladuke

ответ

19

Будет

// mod = a % b 

c = Fix(a/b) 
mod = a - b * c 

делать? Я предполагаю, что вы можете по крайней мере делить здесь. Все ставки отключены на отрицательных числах.

+0

в зависимости от того, что вы хотите для отрицательных чисел, его можно настроить. существует 'fix()', который всегда обрезается и существует 'int()', который всегда округляется вниз ('int (-2.5) = - 3') –

0

Это не может работать для вас производительности мудрый, но:

while (num >= mod_limit) 
    num = num - mod_limit 
+0

@tloflin, надеюсь, что вы не против, но это должно было быть" > = ", а не"> ". – paxdiablo

+0

@paxdiablo, правда, спасибо. – tloflin

+3

, не работая по производительности, вы имели в виду, когда число составляет около 2 ** 63, а mod_limit - 3? –

1

Какой язык это?

Основной алгоритм может быть:

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; 
    } 
} 
+0

Я думаю, что есть ошибка для случая, когда 'target == modulo'. Бесконечная петля. –

4

Для потомков, BrightScript теперь имеет оператор по модулю, это выглядит следующим образом:

c = a mod b 
+0

Это не дает ответа на вопрос. –

+0

@MDXF - он не дает ответа на * заголовок * вопроса, но материально ответы: если вы читаете тело, он говорит: «Этот глупый язык сценариев не имеет% или Mod()» - это был дело в 2010 году, но не более. –

0

В 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; 
} 
+4

Хотя этот фрагмент кода может решить вопрос, [включая объяснение] (// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин вашего предложения кода. Также попробуйте не толковать код с пояснительными комментариями, что уменьшает читаемость кода и объяснений! – kayess

1

Если кто-то прибывает позже, вот еще несколько актуальных алгоритмов (с ошибками ... читайте внимательно)

https://eprint.iacr.org/2014/755.pdf

Есть на самом деле два основных вида формул сокращения: Barett и Монтгомери. Бумага из Eprint повторе как в разных вариантах (алгоритмы 1-3) и дать «улучшенную» версию в алгоритме 4.

Обзор

теперь дать краткий обзор 4. Алгоритм:

1.) Вычислите «A * B» и сохраните весь продукт в «C», что C и модуль $ p $ - это вход для этого алгоритма.

2.) Вычислить длину бит $ p $, скажем: функция «Ширина (p)» возвращает именно это значение.

3.) Разделите входные $ C $ на N "блоки" размера "Ширина (p)" и сохраните каждый в G. Начните с G [0] = lsb (p) и закончите в G [N- 1] = msb (p). (Описание действительно неисправна бумаги)

4.) Запустить время цикла: Set N = N-1 (для достижения последнего элемента) предвычисления $ B: = 2^{Ширина (р)} \ 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 

Это делает много. Не нужно только recursivly уменьшить G [0]:

while G[0] > p do 
    G[0] -= p 
endwhile 
return G[0]// = C mod p 

Остальные три алгоритма хорошо определены, но не хватает какой-то информации или представить это на самом деле не так. Но он работает для любого размера;)

+0

Hi @shalec - мы не поощряем ответы, содержащие только ссылки на внешние ресурсы. Эти [ссылки только ответы не приветствуются] (https://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-answers). – Lix

+0

Можете ли вы скопировать и вставить соответствующие части связанного PDF в свой ответ? Это значительно улучшит качество этой должности. –

+0

Причина. Указано 4 алгоритма. Я отредактирую их. – Shalec