Het resultaat van de modulo-operator begrijpen: %%

Ik ben op zoek naar de methodologie die van toepassing was op de %%-operator in R-taal.

10 %% 10  # 0
20 %% 10  # 0

Twijfel over deze twee resultaten:

10 %% 20  # 10
2 %% 8  # 2

Kun je me helpen de laatste twee resultaten beter te begrijpen? Ik ben een beetje in de war.


Antwoord 1, autoriteit 100%

Niets aan de hand:

10 = 1 * 10 + 0
20 = 2 * 10 + 0
10 = 0 * 20 + 10
2  = 0 * 8  + 2 

De modulo is het getal na +.


Over het algemeen geldt voor twee getallen aen b

a = floor(a / b) * b + (a %% b)

Laten we een speelgoedfunctie schrijven:

foo <- function(a,b) c(quotient = floor(a / b), modulo = a %% b)
foo(10, 10)
#quotient   modulo 
#   1        0 
foo(20, 10)
#quotient   modulo 
#   2        0 
foo(10, 20)
#quotient   modulo 
#   0       10 
foo(2, 8)
#quotient   modulo 
#   0        2 

Update: in plaats van floor(a / b)te gebruiken om een quotiënt te krijgen, kunnen we ook a %/% bgebruiken.


Antwoord 2, autoriteit 4%

Ik probeerde enkele resultaten in R te begrijpen met x modulo y en ik vond deze pagina. Toen ik mezelf enkele “querky” resultaten probeerde uit te leggen, schreef ik dit R-script hieronder. Ik had gelezen dat de rest of het resultaat van de modulo-operator altijd positief zou moeten zijn, maar dit is niet het geval in R, en de definitie en het voorbeeld die hier worden gegeven, verklaren de logica die lijkt te worden gebruikt. Definitie “x mod y = x – ( |x/y| * y)” waarbij |x/y| = vloer(x/y) lijkt altijd waar te zijn in R, of op een meer standaard manier, de definitie van de rest “r” van de bewerking q = x / y is x = kq + r, waarbij k en r zijn beide gehele getallen.
Opmerkingen van mijn script waren in het Frans en kwamen slecht uit, dus ik heb ze verwijderd, maar waren niet nodig om het te begrijpen…
In principe in R met x = 2 en y = – 5, x mod y = -3; of met behulp van definitie x = k
q + r hebben we r = x – kq = -3.
Toch is dit een beetje querky in wiskundige zin omdat “integer part product” (k
q) feitelijk het deeltal (x) overschrijdt, waardoor de rest (r) wordt gedefinieerd als een negatief geheel getal…

x <- 2

y <- -5

q <- x/y

k <- vloer(2/-5)

kq <- vloer(2/-5) * -5

r <- 2 – (verdieping(2/-5) * -5)

x %% j


Antwoord 3, autoriteit 4%

Syntaxis

remainder <- dividend %% divisor

Details

Het enige dat ontbrak in de documentatiewaren de details aan welke kant het dividendis en aan welke kant de deler. Wikipediabeschrijft de twee termen als:

Wat wordt gedeeld, wordt het deeltal genoemd, dat wordt gedeeld door de deler, en het resultaat wordt het quotiënt genoemd. In het voorbeeld is 20 het deeltal, 5 is de deler en 4 is het quotiënt.

In vergelijking met de delingsbewerking geeft de modulo-bewerking echter niet het quotiëntterug. In plaats daarvan geeft het de restterug.

Voorbeelden

Om de modulo-bewerking gemakkelijk te begrijpen, zou idealiter het dividend> deler.

12 %% 11
# quotient is 1.090909
# remainder is 1
12 %% 10
# quotient is 1.2
# remainder is 2
12 %% 9
# quotient is 1.333333
# remainder is 3
12 %% 8
# quotient is 1.5
# remainder is 4
12 %% 7
# quotient is 1.714286
# remainder is 5
12 %% 6
# quotient is 2
# remainder is 0
# 12 is divisible by 6
12 %% 5
# quotient is 2.4
# remainder is 2
12 %% 4
# quotient is 3
# remainder is 0
# 12 is divisible by 4
12 %% 3
# quotient is 4
# remainder is 0
# 12 is divisible by 3
12 %% 2
# quotient is 6
# remainder is 0
# 12 is divisible by 2
12 %% 1
# quotient is 12
# remainder is 0
# any whole number is divisible by 1

Antwoord 4, autoriteit 4%

Ik was ook erg in de war, maar als je begrijpt dat het resultaat van de %%-operator de REST van een deling is, is het heel eenvoudig.

Bijv. 75%%4 = 3

en ik heb gemerkt dat als het dividendlager is dan de deler, R dezelfde waarde voor dividendretourneert.

Bijv. 4%%75 = 4

10 %% 20 = 10
2 %% 8 = 2

Proost


Antwoord 5, autoriteit 4%

Ik zal een andere verklaring aanbieden. Neem dit probleem:

20 %% 10 = 0

Start in plaats van de modulo te evalueren, begin met eenvoudige divisie:

20 / 10 = 2

Zoals u weet, betekent het antwoord “2” dat het twee sets van 10 nodig heeft om 20 te krijgen. Merk op dat we ook het antwoord op deze manier kunnen schrijven met de decimaal, 2.0.

Het decimaal is belangrijk. Wanneer het decimaal is .0, hebben we geen rest. We hebben complete sets. Als de divisie een 0 decimaal oplevert, evalueert de modulo naar nul.

Overweeg dit nu:

11/3 = 3.667

Dat staartdeel, de 0.667, is het gedeelte van een set van 3 die blijft nadat we alle volledige sets van 3 vormen die we kunnen. Aan de linkerkant van de decimaal tonen we:

#Splitting the answer into its components - 3 full sets, 0.667 partial sets
3.0 + 0.667 = 3.667

Dus als we de daadwerkelijke resterende hoeveelheid willen weten, kunnen we 0.667 door de Divisor vermenigvuldigen, 3:

0.667 * 3 = 2

Dit is de rest. Het is de -hoeveelheid die overblijft nadat alle volledige sets van 3 zijn gevormd. Het is hetzelfde resultaat dat we modulo gebruiken:

11 %% 3 = 2

Hetzelfde geldt hier. Gezien dit probleem,

10 %% 20 = 10

We kunnen normaal delen en krijgen:

10 / 20 = 0.5

Als we dit voorlezen, hebben we 0 volledige groepen van 20 (links); we hebben maar een halve set, 0,5, van 20.

0.5 * 20 = 10

Dit komt overeen met:

10 %% 20 = 10

10 is dus de rest. Het is de kloof tussen de 10 die we hebben en de 10 die we nodig hebben om 20 te krijgen.

Other episodes