Kysymys:
Todennäköisyys, että päiden lukumäärä ylittää muottien rullien summan
user239903
2020-08-26 04:08:59 UTC
view on stackexchange narkive permalink

Merkitään $ X $ pisteiden summaa, jonka näemme $ 100 $ -rullaissa, ja anna $ Y $ merkitsee kolojen läppien 600 $ $ päämääriä.Kuinka voin laskea $ P (X > Y)? $


Intuitiivisesti, mielestäni ei ole mukavaa tapaa laskea todennäköisyys;Luulen kuitenkin, että voimme sanoa $ P (X > Y) \ noin 1 $ , koska $ E (X) =350 $ , $ E (Y) = 300 $ , $ \ text {Var} (X) \noin 292 $ , $ \ text {Var} (Y) = 150 $ , mikä tarkoittaa, että keskihajonta on melko pieni.

Onko olemassa parempi tapa lähestyä tätä ongelmaa?Selitykseni näyttää melko käsin aaltoilevalta, ja haluaisin ymmärtää paremman lähestymistavan.

Yksi tapa olisi käyttää normaaleja likiarvoja $ X $: iin ja $ Y: ään, $ sitten itsenäisyyden mukaan arvoon $ X-Y $
Käytän vain normaalia likiarvoa, ellei tarvitsisi tarkkaa vastausta.
Selityksesi * on * aaltoileva, ja se on loistava lähestymistapa.Tällaiset nopeat ja yksinkertaiset kirjekuoren takaosan laskelmat mahdollistavat mielenterveyden tarkistamisen, onko jollakin muulla monimutkaisella laskutoimituksella tai mallin sopivuudella edes järkevää.Ne ovat lähinnä [Fermi-ongelmien] todennäköisyysekvivalentteja (https://fi.wikipedia.org/wiki/Fermi_problem).Jos haastattelisin sinua, olisin todella tyytyväinen ideoihisi.(Vielä onnellisempi, jos keksit myös muita lähestymistapoja, kuten simulaation missä tahansa ohjelmistopaketissa.)
Voisitko pyytää inkvisiittoriasi olemaan realistisempi? "Kaikki tietävät" niiden pisteiden summan, jotka meidän pitäisi nähdä sadassa nopparulla, eikä sitä tapahdu;puolet syystä noppapeleistä. Kun olin noin 12-vuotias, opettaja sai luokan heittämään satoja noppia ja tulos oli hyvin selvä. Numerot kaksi ja viisi olivat kaksi kertaa todennäköisempiä kuin tilastojen mukaan niiden pitäisi olla.Kokeile sitä ennen kuin kieltää sen! Odota kuitenkin ... Ei kahta ja viittä?Etkö tiedä useita noppapelejä, jotka riippuvat seitsemästä?Eikö niin sanota kahdella tai viidellä?
Viisi vastused:
Henry
2020-08-26 14:34:35 UTC
view on stackexchange narkive permalink

On mahdollista tehdä tarkkoja laskelmia.Esimerkiksi julkaisussa R

  rullaa <- 100
kääntää <- 600
ddice <- rep (1/6, 6)
varten (n 2: rullaa) {
  ddice <- (c (0, ddice, 0,0,0,0,0) + c (0,0, ddice, 0,0,0,0) + c (0,0,0, ddice, 0,0,0) +
            c (0,0,0,0, ddice, 0,0) + c (0,0,0,0,0, ddice, 0) + c (0,0,0,0,0,0, ddice)) / 6}
summa (ddice * (1-pbinom (1: flips, flips, 1/2))) # todennäköisyyskolikot lisää
# 0.00809003
summa (ddice * dbinom (1: kääntö, kääntö, 1/2)) # todennäköisyyden yhtälö
# 0.00111972
summa (ddice * pbinom (0: (flips-1), flips, 1/2)) # todennäköisyysnoppa lisää
# 0.99079025
 

tämä viimeinen luku vastaa BruceET: n simulaatiota

Todennäköisyysmassafunktioiden mielenkiintoiset osat näyttävät tältä (kolikko kääntyy punaisella, noppasummat sinisellä)

enter image description here

Rakastan tätä (eikä vain siksi, että olen R-evankelista).Surullinen, että simulaatiovastaukset saivat niin paljon enemmän myönteisiä ääniä.
@CarlWitthoft: Yksi syy siihen, miksi simulaatiovastauksesta saa enemmän ääniä, voi olla, että se on helpompi ymmärtää ja koodata ja vähemmän altis virheille.Uskon, että puhun melko sujuvasti R: stä, mutta en ymmärrä mitä täällä tapahtuu.Äänestin edelleen.Miksi?Koska tulokset vastaavat simulaatiota, siksi olen varma, että ne ovat kunnossa.
BruceET
2020-08-26 05:38:02 UTC
view on stackexchange narkive permalink

Toinen tapa on simuloida miljoona ottelua $ X $ ja $ Y $ välillä likimääräiseksi $ P (X > Y) = 0,9907 \ pm 0,0002. $ [Simulaatio R.: ssä]

  set.seed (825)
d = kopio (10 ^ 6, summa (näyte (1: 6,100, rep = T)) - rbinom (1600, .5))
keskiarvo (d > 0)
[1] 0,990736
2 * sd (d > 0) / 1000
[1] 0,0001916057 # aprx 95% simulointivirhemarginaali
 

enter image description here

Huomautuksia @ AntoniParelladan kommentin mukaan:

R: ssä funktio näyte (1: 6, 100, rep = T) simuloi 100 rullaa kohtuullista muotoa; tämän summa simuloi $ X $ . Myös rbinom on R-koodi simulointia varten binominen satunnaismuuttuja; tässä se on $ Y. $ Ero on $ D = X - Y. $ Menettely replicate tekee miljoonan eron vektorin d . Tällöin (d > 0) on miljoonan TOSI s ja FALSE s looginen vektori, keskiarvo mikä on sen osuus TRUE s - vastauksemme. Lopuksi viimeinen lausunto antaa virhemarginaalin, joka on 95 prosentin luottamusväli suhteesta TOSI s (käyttäen 2: ta 1,96: n sijasta) tarkkuuden todellisuutena simuloidun vastauksen. [Tavallisesti miljoona iteraatiota odottaa 2 tai 3 desimaalin tarkkuudella todennäköisyyksiä varten - joskus enemmän toistaiseksi todennäköisyydet 1/2: sta.]

Voitteko selittää koodin?Käytän R: tä, joten se on minulle selvää, mutta luulen, että viestistäsi olisi enemmän hyötyä, jos koodi selitettäisiin, samoin kuin binomiaalin käyttö ja standardivirheen laskeminen.
Normaaliarvioinnissa on pyöristetyt luvut, joten se voi olla mahdollista haastattelun aikana.Loppujen lopuksi on todennäköistä, että _metodisi_ he haluavat nähdä.Ja sinulla on jo hyvä alku kysymyksessäsi.
Kohteliaisasti rakentavissa ehdotuksissa ei ole mitään vikaa.// Yleensä saan perusvastauksen postitetuksi mahdollisimman pian ja sitten kiihdytän sen kanssa tai teen lisäyksiä vastauksena OP: n kysymyksiin.(Puhumattakaan kirjoitusvirheiden korjaamisesta.)
Simulointi ei ole todiste.Tämä on vanhojen kilpailujen kaivaminen, tekninen ratkaisu, ei matemaattinen ratkaisu
Työhaastattelukysymyksellä pyritään yleensä selvittämään, kuinka mahdollinen työntekijä lähestyy ongelmia.OP: n alkuperäinen hyvin lähestymistapa näyttää hyvältä.Voi myös mainita normaalin likimääräisen, jos sitä pyydetään tarkempaan ratkaisuun.(Ei myöskään todiste.) Joidenkin tyyppisten työpaikkojen kohdalla se voi saada pisteitä mainitsemalla simulaatioita, ehkä saada tarkempi vastaus kuin normaalilla arvolla.Tarkka johdanto etäisyydestä D ei välttämättä anna hyvää vaikutelmaa.// @CarlWitthoft's-kommentti saattaa olla sopivampi 'matematiikka' -sivustolla.Epäilemään monet käyttäjät erehdyttävät simiä muodolliseksi todistukseksi - tai kyseenalaista sen hyödyllisyys.
@BruceET OP kysyi miten * laskea *, ei * arvioida *
Ellei haastattelu koskisi tilastojen tenure track -sijaintia, sanoisin, että simulaatio, jonka koodaus kestää viisi minuuttia, on hyödyllisempi kuin laskenta, jonka tekeminen kestää kolme tuntia ja kaksinkertainen tarkistus.(Ja minun kaltaiset ihmiset tarkistavat silti laskennan tarkalleen tällaisella simulaatiolla.) +1 minulta.
@StephanKolassa Tässä on tarina (totta), jonka Tuftsin professori liittää minuun, kun kävin koodaus- / mallinnuskurssia esihistoriallisina aikoina.Kaksi kollegaa yritti arvioida jotain, yksi laskemalla analyyttisen sarjan laajeneminen ja summaustermit;toinen äärellisen elementin ruudukkomallilla.Tulosten valtava ristiriita, kunnes he huomasivat, että sarjan laajentuminen lähestyi niin hitaasti, että vaadittiin tuhansia termejä.Joten - sinun on osoitettava, että "viiden minuutin simulointisi" on kelvollinen arvio todellisesta järjestelmästä.
@CarlWitthoft Tietysti sinun on pystyttävä osoittamaan, että likiarvo on pätevä.Mutta normaalit likiarvot binomiprosessille [eivät ole täysin tuntemattomia alueita] (https://en.wikipedia.org/wiki/Binomial_distribution#Normal_ approximation).
Robby the Belgian
2020-08-26 05:50:45 UTC
view on stackexchange narkive permalink

Hieman tarkempi:

Kahden itsenäisen satunnaismuuttujan summan tai eron varianssi on niiden varianssien summa. Joten sinulla on jakauma, jonka keskiarvo on 50 $ $ ja keskihajonta $ \ sqrt {292 + 150} \ noin 21 $ . Jos haluamme tietää kuinka usein tämän muuttujan odotetaan olevan alle 0, voimme yrittää arvioida eromme normaalijakaumalla, ja meidän on etsittävä $ z $ span> -score $ z = \ frac {50} {21} \ noin 2,38 $ . Tietysti todellinen jakaumamme on hieman laajempi (koska yhdistämme binomisen pdf: n, jossa on yhtenäinen jakelu-pdf), mutta toivottavasti tämä ei ole liian epätarkkaa. Todennäköisyys, että kokonaissummasi on positiivinen $ z $ -pisteet-taulukon mukaan, on noin 0,992 $ span >.

Suoritin pikakokeilun Pythonissa, suoritin 10000 iteraatiota, ja sain $ \ frac {9923} {10000} $ positiivisia tuloksia. Ei liian kaukana.

Oma koodi:

  tuo numerotiedosto np: ksi
c = np.random.randint (0, 2, koko = (10000, 100, 6)). summa (akseli = -1)
d = np.random.randint (1, 7, koko = (10000, 100))
(d.sum (akseli = -1) > c.sum (akseli = -1)). summa ()
--> 9923
 
Hyvä.Sinulla on sekä simulaatio että normaali noin.(+1)
Se voi olla [jatkuvuuskorjauksen] (https://en.wikipedia.org/wiki/Continuity_correction) arvoinen, joten $ \ Phi ^ {- 1} \ left (\ frac {50-0.5} {\ sqrt {292 + 150}} \ oikealle) \ noin 0,9907256 $, joka on parempi kuin 0,99079025 $: n tarkka vastaus
Ilmari Karonen
2020-08-27 15:05:43 UTC
view on stackexchange narkive permalink

Tarkka vastaus on tarpeeksi helppo laskea numeerisesti - simulointia ei tarvita. Opetustarkoituksiin tässä on perus Python 3 -skripti, joka ei tee valmiita tilastokirjastoja.

  kokoelmien tuonnista defaultdict

# määritä yhden kolikon jakaumat ja kuole
kolikko = kaksinkertainen ((i, 1/2) i: lle (0, 1))
kuolla = kaksinkertainen ((i, 1/6) i: lle (1, 2, 3, 4, 5, 6))

# yksinkertainen funktio kahden satunnaismuuttujan summan laskemiseksi
def add_rv (a, b):
  summa = defaultdict (kelluva)
  i: lle, p in a:
    j: lle, q b: ssä:
      summa [i + j] + = p * q
  return tuple (summa. kohteet ())

# Laske 600 kolikon ja 100 noppan summat
kolikon_summa = nopan_summa = ((0, 1),)
_ alueella (600): kolikon summa = add_rv (kolikon summa, kolikko)
_ alueella (100): noppasumma = add_rv (noppasumma, kuolla)

# laske todennäköisyys, että nopan summa on suurempi
prob = 0
i: lle, p dice_sum:
  j: lle, q kolikkosummassa:
    jos i > j: prob + = p * q

tulosta ("todennäköisyys, että 100 noppaa summautuu yli 600 kolikkoon =% .10f"% prob)
 

Kokeile verkossa!

Yllä oleva komentosarja edustaa erillistä todennäköisyysjakaumaa (arvo, todennäköisyys) -parien luettelona ja käyttää yksinkertaista sisäkkäisten silmukoiden paria laskemaan kahden satunnaismuuttujan summan jakauman (iteroimalla kaikkien mahdollisten arvojen yli) kesät). Tämä ei ole välttämättä tehokkain mahdollinen esitys, mutta sitä on helppo käyttää ja yli tarpeeksi nopeasti tähän tarkoitukseen.

(FWIW, tämä todennäköisyysjakaumien esitys on myös yhteensopiva apuohjelmatoimintojen kanssa monimutkaisempien nopparullien mallintamiseksi, jonka kirjoitin viestiin sisarsivustollemme jonkin aikaa sitten.)


Tällaisia ​​laskutoimituksia varten on tietysti myös toimialakohtaisia ​​kirjastoja ja jopa kokonaisia ​​ohjelmointikieliä. Käyttämällä yhtä tällaista verkkotyökalua, nimeltään AnyDice, sama laskelma voidaan kirjoittaa paljon tiiviimmin:

  X: 100d6
Y: 600d {0,1}
lähtö X > Y nimeltään "1, jos X > Y, muuten 0"
 

Hupun alla uskon, että AnyDice laskee tuloksen melkein kuin Python-komentosarjani, paitsi ehkä hieman enemmän optimoinnilla.Joka tapauksessa molemmat antavat saman todennäköisyyden 0,9907902497, jos nopan summa on suurempi kuin päiden lukumäärä.

Jos haluat, AnyDice voi myös piirtää kahden summan jakauman puolestasi.Jotta saat samanlaisia käyriä Python-koodista, sinun on syötettävä dice_sum - ja coin_sum -luettelot graafin piirtokirjastoon, kuten pyplot.

Silverfish
2020-08-28 14:57:19 UTC
view on stackexchange narkive permalink

Seuraava vastaus on vähän tylsää, mutta näyttää olevan tähän mennessä ainoa, joka sisältää aidosti tarkan vastauksen! Normaali likiarviointi tai simulointi tai jopa vain tarkan vastauksen numeerinen laskeminen kohtuulliselle tarkkuustasolle, joka ei vie kauan, ovat todennäköisesti parempi tapa edetä - mutta jos haluat "matemaattisen" tavan saada tarkka vastaus, niin :

Merkitään $ X $ pisteiden summaa, jonka näemme todennäköisemmin 100 $ $ -rullaissa massatoiminto $ p_X (x) $ .

Tarkoitetaan $ Y $ merkitsemään 600 dollaria $ -kolikkokäännösten päämääriä todennäköisyysmassatoiminnolla $ p_Y (y) $ .

Etsimme $ P (X > Y) = P (X - Y > 0) = P (D > 0) $ missä $ D = X - Y $ on pisteiden summan ja pään määrän välinen ero.

Anna $ Z = -Y $ , todennäköisyysmassafunktiolla $ p_Z (z) = p_Y (-z) $ . Tällöin ero $ D = X - Y $ voidaan kirjoittaa uudelleen summana $ D = X + Z $ span > mikä tarkoittaa, että koska $ X $ ja $ Z $ ovat riippumattomia, voimme löytää todennäköisyysmassafunktion $ D $ ottamalla $ X $ span PMF: ien erillinen konvoluutio > ja $ Z $ :

$$ p_D (d) = \ Pr (X + Z = d) = \ summa_ {k = - \ infty} ^ {\ infty} \ Pr (X = k \ cap Z = d - k) = \ sum_ {k = - \ infty} ^ {\ infty} p_X (k) p_Z (dk) $$

Käytännössä summa on tehtävä vain $ k $ -arvojen yli, joiden todennäköisyydet eivät tietenkään ole nollia. Idea on juuri se, mitä @IlmariKaronen on tehnyt, halusin vain kirjoittaa sille matemaattisen perustan.

En ole vielä sanonut, kuinka löydän harjoitukseksi jätetyn $ X $ PMF: n, mutta huomaa, että jos $ X_1, X_2, \ pisteet, X_ {100} $ ovat pisteiden lukumäärä kussakin 100 itsenäisessä nopparullassa, joista jokaisella on erilliset yhtenäiset PMF: t $ \ {1, 2, 3, 4, 5, 6 \} $ , sitten $ X = X_1 + X_2 + \ pistettä + X_ {100} $ span> ja niin ...

  # Tallenna muuttujien PMF: t datakehyksinä sarakkeisiin "arvo" ja "prob".
# Tärkeää, että arvot ovat peräkkäisiä ja nousevat johdonmukaisuuden suhteen kääntämällä,
# sisällytä tarvittaessa väliarvot todennäköisyydellä 0!

# Toiminto, jolla tarkistetaan, onko datakehys PMF: n määritelmän mukainen
# Selitä viesti_intro avulla, mikä tarkistus epäonnistuu
is.pmf <- funktio (x, message_intro = "") {
  if (! is.data.frame (x)) {stop (paste0 (message_intro, "Not a dataframe"))}}
  if (! nrow (x) > 0) {stop (liitä0 (viesti_intro, "Tietokehyksessä ei ole rivejä"))}
  if (! "value"%% colnames (x)) {stop (paste0 (message_intro, "No 'value' column"))}}
  jos (! "prob"% prosentteina colnames (x)) {stop (liitä0 (viesti_intro, "Ei 'prob' -saraketta"))}
  if (! is.numeric (x  $ value)) {stop (liitä0 (message_intro, "arvo" -sarake ei numeerinen ")}}
  if (! all (is.finite (x $  value))) {stop (paste0 (message_intro, "Sisältääkö 'arvo' NA, Inf, NaN jne.?))}
  if (! all (diff (x  $ value) == 1)) {stop (liitä0 (message_intro, "'arvo' ei ole peräkkäinen ja nouseva"))}
  if (! is.numeric (x $  prob)) {stop (paste0 (message_intro, "prob" -sarake ei numeerinen "))}
if (! all (is.finite (x  $ prob))) {stop (paste0 (message_intro, "Sisältääkö 'prob' NA: ta, Inf, NaN jne."))}
  jos (! all.equal (summa (x $  prob), 1)) {stop (liitä0 (message_intro, "prob" -sarake ei ole summa 1 "))}
  paluu (TOSI)
}

# Toiminto yhdistää x: n ja y: n PMF: t
# Huomaa, että R: n kääntymiseksi meidän on käännettävä toinen vektori
# name1 ja name2 käytetään kahden syötteen virheraportoinnissa
convolve.pmf <- funktio (x, y, nimi1 = "x", nimi2 = "y") {
  is.pmf (x, message_intro = paste0 ("Tarkistetaan", nimi1, "on kelvollinen PMF:"))
  is.pmf (y, message_intro = paste0 ("Tarkistetaan", nimi2, "on kelvollinen PMF:"))
  x_plus_y <- data.frame (
    arvo = seq (alkaen = min (x  $ arvo) + min (y $  arvo),
                arvoon = max (x  $ arvo) + max (y $  arvo),
                = 1),
    prob = convolve (x  $ prob, rev (y $  prob), type = "open")
  )
  paluu (x_plus_y)
}

# Olkoon x_i yksittäisten noppaheittojen pistemäärä i
# Huomaa, että x_i: n PMF on sama jokaiselle i = 1 - i = 100)
x_i <- data.frame (
  arvo = 1: 6,
  prob = rep (1/6, 6)
)

# Olkoon t_i x_1, x_2, ..., x_i summa
# Tallennamme t_1, t_2 ... PMF: t luetteloon
t_i <- luettelo ()
t_i [[1]] <- x_i # t_1 on vain x_1, joten sillä on sama PMF
T_i: n PMF on t_ (i-1): n ja x_i: n PMF: ien konvoluutio
(i in 2: 100) {
  t_i [[i]] <- sekoittaa.pmf (t_i [[i-1]], x_i,
        nimi1 = liitä0 ("t_i [[", i-1, "]]"), nimi2 = "x_i")
}

# Olkoon x kaikkien 100 itsenäisen nopparullan pisteiden summa
x <- t_i [[100]]
is.pmf (x, message_intro = "Tarkistetaan, että x on kelvollinen PMF:")

# Olkoon y kolikkopään lukumäärä 600 kolikkolevyssä, joten Binomial (600, 0,5) -jakauma on sama:
y <- data.frame (arvo = 0: 600)
y  $ prob <- dbinom (y $  arvo, koko = 600, prob = 0,5)
is.pmf (y, message_intro = "Tarkistetaan, onko y kelvollinen PMF:")
# Olkoon z negatiivinen arvosta y (huomaa, että käännämme järjestyksen, jotta arvot pysyvät nousevina)
z <- data.frame (arvo = -rev (y  $ arvo), prob = rev (y $  prob))
is.pmf (z, message_intro = "Tarkistetaan, onko z kelvollinen PMF:")

# Olkoon d ero, d = x - y = x + z
d <- muodostaa.pmf (x, z, nimi1 = "x", nimi2 = "z")
is.pmf (d, message_intro = "Tarkistetaan d on kelvollinen PMF:")

# Prob (X > Y) = Prob (D > 0)
summa (d [d $ arvo > 0, "prob"])
# [1] 0,9907902
 

Kokeile verkossa!

Ei sillä ole merkitystä, jos saavutat kohtuullisen tarkkuuden, koska yllä oleva koodi toimii joka sekunnin murto-osassa, mutta on olemassa oikotie 100 itsenäisen identtisesti jakautuneen muuttujan summan tekemiseksi: 100 = 64 + 32 + 4 ilmaistuna 2: n voimien summana, voit jatkaa välivaiheen vastausten itsesi kanssa mahdollisimman paljon. Ensimmäisten $ i $ nopparullien välisummien kirjoittaminen muodossa $ T_i = \ sum_ {k = 1} ^ {k = i} X_k $ voimme saada $ T_2 = X_1 + X_2 $ , $ T_4 = T_2 PMF: t + T_2 '$ (missä $ T_2' $ on riippumaton $ T_2 $ , mutta on sama PMF) ja vastaavasti $ T_8 = T_4 + T_4 '$ , $ T_ {16} = T_8 + T_8' $ , $ T_ {32} = T_ {16} + T_ {16} '$ ja $ T_ {64} = T_ {32} + T_ {32} '$ . Tarvitsemme vielä kaksi kierrosta, jotta löydämme kaikkien 100 nopan kokonaispistemäärän kolmen itsenäisen muuttujan summana, $ X = T_ {100} = (T_ {64} + T_ {32} '') + T_4 '' $ , ja lopullinen kääntäminen $ D = X + Z $ . Joten luulen, että tarvitset vain yhdeksän kääntymistä - ja lopullista varten voit rajoittaa vain ne osat, jotka antavat positiivisen arvon $ D $ . Tai jos se on vähemmän vaivaa, osat, jotka antavat ei-positiiviset arvot $ D $ ja ottavat sitten täydennyksen. Jos valitset tehokkaimman tavan, luulen, että pahin tapauksesi on tosiasiassa kahdeksan ja puoli kääntymistä. MUOKKAA: ja kuten @whuber ehdottaa, tämä ei myöskään ole välttämättä optimaalinen!

Käyttämällä tunnistamaani yhdeksän konvoluutiomenetelmää gmp-paketin kanssa, jotta voisin työskennellä bigq -objektien kanssa ja kirjoittaa ei-optimoidun silmukan konvoluutiot (koska R: n sisäänrakennettu menetelmä ei käsittele bigq -tuloja), tarkan yksinkertaistetun murto-osan laatiminen kesti vain muutaman sekunnin:

1342994286789364913259466589226414913145071640552263974478047652925028002001448330257335942966819418087658458889485712017471984746983053946540181650207455490497876104509955761041797420425037042000821811370562452822223052224332163891926447848261758144860052289/1355477899826721990460331878897812400287035152117007099242967137806414779868504848322476153909567683818236244909105993544861767898849017476783551366983047536680132501682168520276732248143444078295080865383592365060506205489222306287318639217916612944423026688

joka todellakin pyöristyy arvoon 0,9907902. Tarkan vastauksen saamiseksi en olisi halunnut tehdä sitä liian monilla muutoksilla, tunsin kannettavan tietokoneeni vaihteiden alkavan kurisevan!

Vaikka onkin intuitiivisesti ilmeistä, että tällaiset binääriset hajoamiset tuottavat hyötysuhteita, saattaa kiinnostaa sinua, että ne eivät välttämättä tuota tehokkainta menetelmää.Pieni esimerkki on 15 = 1111B = 1 + 2 + 4 + 8.Binaarisen hajoamisen jälkeen saatamme laskea käänteisiä järjestyksessä 2 = 1 + 1, 4 = 2 + 2, 8 = 4 + 4 ja sitten 15 = 1 + 2 + 4 + 8, mikä vaatii 6 operaatiota;mutta tämä voidaan saavuttaa vain viidellä operaatiolla laskemalla 2, 4, 5 = 1 + 4, 10 = 5 + 5, 15 = 5 + 10.Muistan, että Donald Knuth keskustelee tästä ongelmasta artikkelissa * Art of Computer Programming. * Https://stats.stackexchange.com/questions/5347 liittyy läheisesti toisiinsa.
koodin uudelleen: Muutama vuosi sitten minusta oli kätevää käyttää samaa lähestymistapaa ylikuormittamalla aritmeettiset perusoperaattorit: https://stats.stackexchange.com/a/116913/919.
@whuber Hienoa!Luulen, että minua inspiroi sellainen koodi, jonka olin nähnyt muualla, joko sinulta tai mahdollisesti sudilta.Re tehokkain tapa tehdä kierteet: todella mielenkiintoista!Oli havaittavissa, kuinka paljon hitaampia lopulliset kääntymät olivat, mikä saa minut miettimään, onko mitään eroja minimoida kääntymisten lukumäärä ja (vielä parempi) minimoida yksikään toiminto.Luulen, että pituuksien $ m $ ja $ n $ sekoittaminen vetoaa $ mn $ -kertoihin ja $ mn-m-n + 1 $ -lisäyksiin (tarkkojen murtolukujen yhteisten nimittäjien laskelmat eivät ole vähäpätöisen halpoja) ...
... Näyttää siltä, että iso $ mn $ on ongelma jommallakummalla tavalla, joten tavoitteena on pitää tuote pienenä ja samalla rakentaa summa nopeasti.($ K $ noppien summa voi vaihdella välillä $ k $ - $ 6k $, joten sen PMF-vektorin tulee sisältää $ m = 5k + 1 $ -todennäköisyydet. Siksi summa $ m + n $ tuleeole lähes verrannollinen niiden noppien lukumäärän summaan, jonka yrität rakentaa 100: een.) 1 + 9 tekeminen on helpompi tapa saada 10 kuin esimerkiksi 5 + 5 - parempi pitää summa "viistona"".Mikä viittaa "kaksinkertaistamiseen" -lähestymistapaani, ei kenties ollut niin fiksu idea!
(Ja enemmän huomautukseksi itselleni: "Suurten rationaalien" avulla epäilen, että olisin voinut säästää paljon aikaa pelkästään varastoimalla osoittajat "suurina kokonaislukuina" ja pitämällä kirjaa yhteisestä nimittäjästä jokaiselle todennäköisyysvektorille ...)
Peräkkäisten sekaannusten aikana työskentelet suoraan Fourier-muunnosten kanssa.Täten jokainen konvoluutio vaatii $ \ max (m, n) $ -kertoja eikä lisäyksiä.Yksi ehdottamistani ratkaisuista on käyttää arvioita alusta alkaen niiden lopullisten arvojen alueen arvioimiseksi, joilla on merkityksellisiä nollatodennäköisyyksiä, ja rajoittaa sitten kaikki laskelmat kyseiselle lopulliselle alueelle merkityksellisiin arvoihin: tämä asettaa ylärajan kuinka suuri $ \ max (m, n) $ tulee olemaan.Katso lisätietoja osoitteesta https://stats.stackexchange.com/a/5482/919 ja vielä enemmän osoitteesta https://stats.stackexchange.com/a/291571/919.
@whuber Kyllä, mieluiten käyttäisin FFT: tä - kommenttini koski vain "suurten järjen" laskutoimitusta, jota käytin saadakseni * tarkan * vastauksen, joten valitettavasti ei arvioita minulle, ja niin pitkälle kuin voin kertoa R-paketille `gmp` ei tue kääntymistä / FFT: tä `` bigq`-objekteille :-( Lisää "käytännön" tarkoituksiin viesteissäsi annetut likiarvot ovat erittäin käteviä!


Tämä Q & A käännettiin automaattisesti englanniksi.Alkuperäinen sisältö on saatavilla stackexchange-palvelussa, jota kiitämme cc by-sa 4.0-lisenssistä, jolla sitä jaetaan.
Loading...