Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.
Nástěnka
❗22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
❗04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
❗23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.
Nejste přihlášen(a). Přihlásit
Stránky: 1 2
↑↑ mák: Zrovna jsem se k tomu taky dopocital, mohl jsem nejdriv zkouknout forum…
↑↑ check_drummer: Da se to hrubou silou, moznosti je necelych 7 milionu, i python to zvladne z par vterin.
Offline
↑ Stýv:
Ale musíš to nějak omezit ne? Protože číslic je 20 a každá má 10 možností... To je víc než 7 milionů.
Offline
↑ check_drummer: Staci uvazovat kombinace cislic bez ohledu na poradi. Napr. 10 jednicek a 10 dvojek: Spocitam 10*1^20 + 10*2^20 a overim, jestli vysledek ma ocekavany pocet jednotlivych cifer.
Offline
Zdravím, já jsem použil z pohodlnosti program Maxima.
A protože nevím jak se generují sestavy bez opakování, nechal jsem je vygenerovat s opakováním tak, aby každé číslo tam bylo použito minimálně ani jednou a maximálně pětkrát příkazem:
Sestavy_s_opakovanim: cartesian_product_list( [0,1],[0,1,2], [1,2],[1,2,3], [2,3],[2,3,4], [3,4],[3,4,5], [4,5],[4,5,6], [5,6],[5,6,7], [6,7],[6,7,8], [7,8],[7,8,9], [8,9],[8,9,0], [9,0],[9,0,1] )$
Vyšlo 60466176 možností.
To jsem zredukoval příkazem:
Sestavy_bez_opakovani: unique(sort(map(lambda([z], sort(z)), Sestavy_s_opakovanim)))$
na počet 465125.
Ty jsem otestoval zda splňují požadovanou podmínku. Vyšla jediná možnost.
Offline
↑ mák:
Tajk to mi asi něco uniklo - nemusíš tedy procházet všechna možnosti? Věchny 20-tice číslic 1 až 9?
Offline
Praktická úloha je vyřešena (geolokace kešky), ale ještě přemýšlím nad samotným čistě matematickým (programátorským) problémem:
↑ Stýv: Dobře, takových možností je [mathjax]\binom{29}{20}=10\,015\,005[/mathjax], to už je zvládnutelný počet na rozdíl od [mathjax]10^{20}[/mathjax] při opačném postupu, ale jak naprogramovat plnění těch proměnných (kombinace s opakováním), to mě nijak nenapadá...
↑ mák: Jestli tomu dobře rozumím, tak jsi testoval jen některé možnosti (min 0krát a max 5krát) a náhodou mezi nimi bylo jedno z možných řešení? A co když jsou další řešení (viz níže)? Nebo jsem to špatně pochopil?
Pro zajímavost, zkusil jsem na to jít od jednodušších úloh podobného zadání s kompletním řešením všech možností, ale u vyšších mocnin jsem se už zasekl, třeba někoho napadne něco dalšího:
[mathjax]A^1=A[/mathjax], možná řešení [mathjax]\{0,1,2,3,4,5,6,7,8,9\}[/mathjax]
[mathjax]A^2+B^2=AB[/mathjax], nemá řešení [mathjax]\emptyset[/mathjax]
[mathjax]A^3+B^3+C^3=ABC[/mathjax], možná řešení [mathjax]\{153,370,371,407\}[/mathjax]
[mathjax]A^4+B^4+C^4+D^4=ABCD[/mathjax], možná řešení [mathjax]\{1634,8208,9474\}[/mathjax]
[mathjax]A^5+B^5+C^5+D^5+E^5=ABCDE[/mathjax], možná řešení [mathjax]\{54748,92727,93084\}[/mathjax]
[mathjax]A^6+B^6+C^6+D^6+E^6+F^6=ABCDEF[/mathjax], možná řešení [mathjax]\{548834\}[/mathjax]
[mathjax]A^7+B^7+C^7+D^7+E^7+F^7+G^7=ABCDEFG[/mathjax], možná řešení [mathjax]\{1741725,4210818,9800817,9926315\}[/mathjax]
[mathjax]A^8+B^8+C^8+D^8+E^8+F^8+G^8+H^8=ABCDEFGH[/mathjax], možná řešení [mathjax]\{24678050,24678051,88593477\}[/mathjax]
[mathjax]A^9+B^9+C^9+D^9+E^9+F^9+G^9+H^9+I^9=ABCDEFGHI[/mathjax], možná řešení [mathjax]\{146511208,472335975,534494836,912985153\}[/mathjax]
Teď už je asi jasné, proč si myslím, že zadaná rovnice má více řešení...
Offline
Aha, stačí spočítat součet těch mocnin a zjistit ty číslice výsledku....
Offline
↑ surovec:
Budeš to generovat jako uspořádané n-tice, to jde algoritmicky snadno provést....
Offline
↑ check_drummer:Ano, věřím, že to asi jde snadno, ale to není ta pravá odpověď, ve kterou jsem doufal ;-)
Rozumíme si v tom, že chci vygenerovat všechny k-členné kombinace s opakováním z n-prvků, nikoliv variace? Čuchám v tom nějakou rekurzi, ale zatím mě nic nenapadá...
Offline
↑ surovec:
Tak jako první umstím x:=1 a potom každé další umístěné číslo nesmí být menší než x... (a už jich umístím jen k-1) to je ta rekurze... :-)
A až teda odbudu tu 1, tak zkusím x:=2, atd...
Offline
powers = [i**20 for i in range(10)] count = 0 for n9 in range(1, 21): for n8 in range(0, 21-n9): for n7 in range(0, 21-n9-n8): for n6 in range(0, 21-n9-n8-n7): for n5 in range(0, 21-n9-n8-n7-n6): for n4 in range(0, 21-n9-n8-n7-n6-n5): for n3 in range(0, 21-n9-n8-n7-n6-n5-n4): for n2 in range(0, 21-n9-n8-n7-n6-n5-n4-n3): for n1 in range(0, 21-n9-n8-n7-n6-n5-n4-n3-n2): digit_counts = [20-n1-n2-n3-n4-n5-n6-n7-n8-n9,n1,n2,n3,n4,n5,n6,n7,n8,n9] value = sum([digit_counts[i]*powers[i] for i in range(10)]) value_digits = [int(c) for c in str(value)] value_counts = [0]*10 for d in value_digits: value_counts[d] += 1 if digit_counts == value_counts: print(value) exit() count +=1 if count % 1000 == 0: print(count)
Neni to prilis elegantni, ale funguje.
Offline
↑ Stýv:
Dala by se udělat funkce s jedním for cyklem co se bude provolávat rekurzivně.
Offline
Stránky: 1 2