A pontosan 10-hatvány számjegyből álló faktoriális értékek ritkák. Melyik a következő?
13! éppen 10, 205022! pedig 10^6 számjegyből áll. (10^2, 10^3, 10^4, 10^5 számjegyből álló nincs.)
Melyik a következő? (… olyan szám, amelynek faktoriálisa 10^n (n>0, egész) számjegyből áll?)
"nem látom, hogy hol kezdődik a szám tizedes része. "
Így igaz, nem látszik. (Én rákerestem az utolsó számjegyekre)
"1450 és 53 ezek hogy jönnek ki?"
Csak kb-re írtam (lg √2πx miatt):
(2902 - lg 2902)/2 ~ 1450 ill. (108 - lg 108)/2 ~ 53
Egyrészt korrigálom magam: az a képlet, amit a Wolfram írt, valamit az, ami #12-ben van linkelve, valójában ugyanaz. Felületesen néztem csak meg először, azért nem jöttem rá kapásból.
Másrészt:
"Talán épp azért kerekített rossz felé, mert nincs a √2πx-es tag figyelembe véve. :D"
- Nem kell kerekíteni, vágni kell, hisz k! = 10ⁿ megoldását adja, de az már n+1 jegyű. (Ezt #19 is írta)
- A Stirling-féle kifejezés logaritmusára (n+1/2)·lg(n/e) jobb közelítés, a fél a √x-ből jön. Ebből következik, hogy a W függvényes képlet n helyett n+1/2-et számolja ki. Ezért lett majdnem kereken 0.5 a törtrész. Ezt az 1/2-et tudtam korábban is, csak nem akartam hosszabban írni, hisz úgyis levágjuk a törtrészt.
"de ott nem látom, hogy hol kezdődik a szám tizedes része"
Nekem is sokat kellett néznem :) Türelmesen kibogoztam, nagyjából minden 100-adik számjegyet (pontosabban 4 hosszú számsorozatokat) lokalizáltam, hogy eljussak a tizedes helyéig. Olyan #9-ben látott sorozatokat kerestem, mint 1111 meg 777, stb.
Miután megírtam tegnap láttam, hogy valami nem stimmel, de nem volt hozzá már eszem (fáradt voltam), Nem értettem, hogy van az, hogy a törtrészt le kell vágni, de egy szám n számjegyeinek száma egyel többnek kell lennie pl log10(13) = 1.1139, log10(185)=2.2672 , a törtrész levágása után 1-et hozzá kell adni, nem értettem hova tűnt azaz 1.
Az oda tűnt , hogy log10(2*pi*n)/2-es tagot lehagytad. ***
Én valamiért úgy implementáltam, hogy mindig felfele kerekítem a faktoriális jegyeit számoló függvényben ami úgy működik, hogy meghívja a logStirling függvényt a visszaadott értékét felfele kerekíti ami jó megoldást ad ha nem pontosan 10 valamely hatványát adja vissza, de ez nem lehet mert egész értéket sem ad vissza sose.
***
pl
A logStirling2 legyen a te változatod amibe a log10(2*pi*n)/2-es tag nincs.
logStirling(100) = 157.96964...
logStirling2(100) = 156.57055...
De továbbmegyek, itt már csal a te változatod, pedig nem is nagy argumentumot kapott
logStirling(125)=209.274486
logStirling2(125)=207.826941
Továbbá:
logStirling(10^56) = 5 556 570 551 809 674 817 234 887 108 108 339 491 770 560 299 419 633 343 416.9537...
logStirling2(10^56) = 5 556 570 551 809 674 817 234 887 108 108 339 491 770 560 299 419 633 343 388.5546...
A korrigált (n+1/2)·lg(n/e) változatodba is találtam hibát amit nem írtam le, az kevesebbet csalt. Én a Stirling formulának a logaritmusát használtam ami bizonyítottan helyes értéket ad, csak megfelelően kell kerekíteni ha a számjegyek számára vagyok kíváncsi. A pi és e értékeit nagy pontossággal vettem "kilométer hosszan" nagy argumentumok esetén, de lehet nem kellett volna.
Teljesen logikus, amit írsz, majd elgondolkodom rajta. Nem is azon, amit írtál, az jónak tűnik, hanem azon, hogy miért jött ki a W függvénnyel mégis a pontos eredmény. Vagy elkavarodtam a sok számjegy között???
Eredetileg nem akartam a W-vel pontos eredményt kihozni, azért is számoltam a durva n·lg(n/e)-vel. Gondoltam, a W ad majd egy nagyon jó induló értéket a Newton-Raphson-hoz. Abban természetesen a teljes Stirling formulát használtam.
A pontos logStirling érték egyébként ennyi:
(n+1/2)·lg(n/e) + lg(2π·e)/2
A végén egy konstans van: 0,616 (nem kell sok tizedessel számolni), de nagyon fontos hozzáadni az első taghoz, hisz egész pontossággal kell a számjegyek száma. (Én 5 tizedesjeggyel számoltam, de az túlzás.)
Ma fárasztó napom volt, még a munkahelyen vagyok, most indulok haza... majd valamikor belegondolok, amikor pihentebb leszek :)
Nem volt korábban időm foglalkozni vele, csak most válaszolok:
#25: Hmm, tényleg bug van benne. Kisebb számokkal is találtam hasonló hibákat, valószínű nem jó pontossággal számol a WolframAlpha bizonyos jellegű input-ok esetén. Maga az algebra engine a belsejében jó, csak valószínű nem jól hajták meg az Alpha-ból. De ennek a bug-nak nincs szerepe abban, amit a W körül láttunk.
#23: A kerekítéssel nincs gond, kétféleképpen kell csinálni attól függően, hogy mit számol az ember:
a) Számjegyek száma n alapján:
Itt az lg n! (illetve az lgStirling) értékét le kell vágni egészre, majd 1-et hozzá kell adni. (Ez most ugyanaz, mintha felfelé kerekítenének, mert a faktoriális sosem lesz 10 hatvány, kivéve persze n=1-et).
b) n kiszámolása a számjegyek száma alapján:
Itt az inverz függvény (a W()-vel) értékét le kell vágni egészre, és NEM kell hozzáadni 1-et! Ugyanis kb. ezt az egyenletet oldjuk meg:
lg n! = 10^k
aminek a megoldása egy törtszám, de az a logaritmus (illetve Γ(n+1)) már éppen k+1 jegyű lenne. A nála kisebb egész faktoriálisa k, vagy k-nál kevesebb jegyű.
----
Na most eddig szerintem tiszta; amit nem értettem az az, hogy miért lesz pontos eredmény annak ellenére, hogy az x·lg(x/e) közel sem kielégítő közelítése a logfaktnak. Pl. az "x·lg(x/e) = 10^6" megoldásakor a Wolfram a durva közelítés inverz függvényét számolta ki, az eredmény 205022.747... lett. Ott csak vágni kell, nem kell 1-gyel növelni, és a pontos 205022-es érték jött ki.
Ez a rejtély megoldása:
A szokásos Stirling közelítés, de 10-es alapú logaritmussal, ez:
lg x! ≈ x·lg(x/e) + lg(2πx)/2
Kicsit átrendezve:
= (x+1/2)·lg(x/e) + lg(2πe)/2
Másik közelítés, amit máshol eddig nem láttam, csak a #12-ben linkelve (Gary, StackExchange):
(x+1/2)·lg((x+1/2)/e) + lg(2π)/2
vagyis kihagyott egy lge/2-t, de növelte az lgx-et.
Kipróbáltam, ez a közelítés minden x-re fele akkora hibájú, mint a Stirling, de közel sem annyival jobb, mintha a Stirlinghez hozzátennénk a Stirling sorozat következő tagját (ami lge/(12x) ha 10-es alapon számolunk).
Az x·lg(x/e) Gary függvényének egy egyszerű transzformáltja: el van tolva x-ben balra 1/2-del, y-ban felfelé lg(2π)/2-vel (ami 0.399 nagyságrendű).
x·lg(x/e) = 10^k megoldása:
x/e · lg(x/e) = 10^k/e
x/e · ln(x/e) = 10^k/(e·lge)
e^ln(x/e) · ln(x/e) = 10^k/(e·lge)
Mivel W(z)·e^W(z) = z, ezért:
W(10^k/(e·lge)) = ln(x/e)
x = e·e^W(10^k/(e·lge))
vagy kicsit átrendezve, ahogy Gary is csinálta ezzel az azonossággal: e^W(z) = z/W(z)
x = 10^k / (lge · W(10^k/(e·lge)))
Ebből az n értéke:
- egyrészt 1/2-et le kell x-ből vonni. Mivel utána úgyis levágjuk a tizedeseket, és (legalábbis a kipróbált értékek) mind 0.5-nél nagyobbra végződtek, ezért nem okozott semmilyen változást n-ben, ha nem vontuk le.
- 0.399-det le kell vonni y-ból, vagyis 10^k helyett (10^k - 0.399)-del kell számolni. A W() egy lapos függvény, 10^k mellett az a pici érték alig módosít valamit, x-ben az ezredeknél van csak változás. Szóval n-ben megint csak nincs változás.
Pl. 10^6 esetén:
10^6/(e·lge) = 847073.71726034307657914551723752985666319021428661...
W(10^6/(e·lge)) = 11.230876213179728891517310917345660321118755255069...
x = 205022.74704905940119945919847001924609822477534299...
(10^6-lg(2π)/2)/(e·lge) = 847073.37920174901033924314695807889514431594577285...
W((10^6-lg(2π)/2)/(e·lge)) = 11.230875846719431282659421539531077221238495424576...
x = 205022.75373889356245326376710777357115217875464588...
Itt most 0.0067 a különbség.
Ebből az x-ből kell még 1/2-et levonni, aztán levágni a törtrészt, n = 205022.
---
Persze ez csak arra magyarázat, hogy amiket kipróbáltam, azoknál miért jött ki a pontos érték a durva közelítés ellenére is. Ha írnék programot erre a problémára a W()-vel, akkor sem az 1/2-től, sem a 0.399-től nem tekintenék el.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!