2010-05-03 8 views
11

Ten głupi język skryptowy nie ma wartości% ani Mod(). Mam Fix(), który odciąga część dziesiętną liczby. Potrzebuję tylko pozytywnych wyników, więc nie bądź zbyt solidny.Jak mogę zrobić mod bez operatora mod?

+2

Czy mógłbyś wspomnieć, a może oznaczyć, który "głupi" język skryptowy, o którym mówisz? –

+0

Myślę, że to głupi język o nazwie "praca domowa" – Gareth

+1

Heh.To jest trochę osadzonego języka na tym odtwarzaczu wideo z cyfrowym signage Roku. Prawdopodobnie ma jakiś Mod gdzieś, ale na pewno go nie znajduję i ma jak Arctan() i NaturalLog(), więc jestem bardzo zdezorientowany, jak pomijali Mod. – tladuke

Odpowiedz

19

Will

// mod = a % b 

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

zrobić? Zakładam, że możesz tu przynajmniej podzielić. Wszystkie zakłady są wyłączone na liczbach ujemnych.

+0

w zależności od tego, co chcesz dla liczb ujemnych, można go dostosować. istnieje 'fix()', które zawsze obcina i jest 'int()', które zawsze zaokrągla w dół ('int (-2,5) = - 3') –

0

ta może nie działać dla ciebie wydajności mądry, ale:

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

@tloflin, mam nadzieję, że nie masz nic przeciwko, ale powinno być" > = "raczej niż"> ". – paxdiablo

+0

@paxdiablo, prawda, dzięki. – tloflin

+3

nie działając pod względem wydajności, czy miałeś na myśli, gdy num wynosi około 2 ** 63, a mod_limit wynosi 3? –

1

Co to jest język?

Podstawowy algorytm może być:

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

Myślę, że wystąpił błąd w przypadku, gdy 'target == modulo'. Nieskończona pętla. –

4

dla potomności, BrightScript ma teraz operator modulo, wygląda to tak:

c = a mod b 
+0

Nie zapewnia to odpowiedzi na pytanie. –

+0

@MDXF - nie zapewnia odpowiedzi na * tytuł * pytania, ale istotna odpowiedź brzmi: jeśli czytasz ciało, mówi: "Ten głupi język skryptowy nie ma% ani Mod()" - to był sprawa na rok 2010, ale nie więcej. –

0

w 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

Chociaż ten fragment kodu może rozwiązać pytanie, [w tym wyjaśnienie] (// meta.stackexchange.com/questions/114762/explaining-entirely-code-ans -answers) naprawdę pomaga poprawić jakość twojego posta. Pamiętaj, że odpowiadasz na pytanie przeznaczone dla czytelników w przyszłości, a te osoby mogą nie znać powodów sugestii dotyczących kodu. Proszę również starać się nie tłumić kodu za pomocą komentarzy wyjaśniających, co zmniejsza czytelność zarówno kodu, jak i objaśnień! – kayess

1

Jeśli Ktoś przyjedzie później, oto kilka bardziej aktualnych algorytmów (z błędami ... przeczytaj uważnie)

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

Są faktycznie dwa główne rodzaj wzorów redukcyjnych: Barett i Montgomery. W pracy z ePrint powtarzać zarówno w różnych wersjach (algorytmy 1-3) i dać „ulepszoną” wersję algorytmu 4.

Przegląd

daję teraz przegląd Algorytm 4.:

1.) Oblicz "A * B" i zapisz cały produkt w "C", w którym C i moduł $ p $ jest wejściem dla tego algorytmu.

2.) Oblicz bitową długość $ p $, na przykład: funkcja "Szerokość (p)" zwraca dokładnie tę wartość.

3.) Podziel dane wejściowe $ C $ na N "bloków" o wielkości "Szerokość (p)" i zapisz każdą z nich w G. Rozpocznij w G [0] = lsb (p) i zakończ w G [N- 1] = msb (p). (Opis jest rzeczywiście wadliwy papieru)

4.) Start pętli, przy czym: ustawia się N = N-1 (osiągnąć ostatni element) wstępnego wyliczenia $ B: = 2^{szerokość (t)} \ 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 

To dużo. Nie musimy tylko recursivly zmniejszyć G [0]:

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

Pozostałe trzy algorytmy są dobrze zdefiniowane, ale brakuje pewnych informacji lub przedstawienia to naprawdę źle. Ale działa na dowolny rozmiar;)

+0

Hi @shalec - nie zachęcamy do odpowiedzi, które zawierają tylko linki do zewnętrznych zasobów. Te [odsyłające tylko do linków odpowiedzi są odradzane] (https://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-answers). – Lix

+0

Czy możesz skopiować i wkleić odpowiednie części połączonego pliku PDF do swojej odpowiedzi? To znacznie poprawiłoby jakość tego postu. –

+0

Przyczyna. Wspomniano o 4 algorytmach. Będę edytować te. – Shalec