|
•Cosmin
|
 |
« : August 18, 2011, 05:24:48 » |
|
|
|
|
|
|
Memorat
|
|
|
|
•dbaluta
Strain
Karma: 1
Deconectat
Mesaje: 6
|
 |
« Răspunde #1 : August 18, 2011, 11:01:15 » |
|
O(logn), dat fiind faptul că știm formula pentru al n-lea Fibonacci number și a n-a puterea a lui x se poate calcula în O(logn).
|
|
|
|
|
Memorat
|
|
|
|
|
•scipianus
|
 |
« Răspunde #2 : August 18, 2011, 11:07:49 » |
|
Da,de aceeasi parere sunt si eu. Avand formula pentru al n-lea termen trebuie facuta doar ridicarea la putere in timp logaritmic,deci complexitate O(log n) , doar ca precizia nu stiu cat de mare va fi la radicalii aia  . 
|
|
|
|
|
Memorat
|
|
|
|
|
•Vman
|
 |
« Răspunde #3 : August 18, 2011, 11:37:27 » |
|
se poate si fara golden ratio, cu exponentiere de matrice si nu mai ai probleme cu precizia o alta alternativa ar fi plecand de la formulele F(2k) = F(k)[2F(k+1)−F(k)] F(2k+1) = F(k+1)^2+F(k)^2 iar inmultirile se pot face ceva mai repede cu http://en.wikipedia.org/wiki/Karatsuba_algorithm
|
|
|
|
« Ultima modificare: August 18, 2011, 11:53:37 de către Duta Vlad »
|
Memorat
|
|
|
|
•bent_larsen
Strain
Karma: 1
Deconectat
Mesaje: 18
|
 |
« Răspunde #4 : August 18, 2011, 11:39:53 » |
|
Parca e si in arhiva educationala Cosmin problema asta daca nu ma insel.
|
|
|
|
|
Memorat
|
|
|
|
|
•Cosmin
|
 |
« Răspunde #5 : August 18, 2011, 11:51:32 » |
|
Rezultatul Fn are O(n/log n) cifre. Deci algoritmul trebuie sa aiba cel putin timp de rulare O(n/log n).
Formula cu ratia de aur nu e prea utila pt ca faci calcule cu numere irationale si ai nevoie de precizie buna.
|
|
|
|
« Ultima modificare: August 18, 2011, 12:03:57 de către Cosmin Negruseri »
|
Memorat
|
|
|
|
•yonatan
Strain
Karma: 10
Deconectat
Mesaje: 47
|
 |
« Răspunde #6 : August 18, 2011, 20:18:53 » |
|
Nu se poate face cu ridicare la putere in timp logaritmic de matrice? Ca la problema iepuri http://infoarena.ro/problema/iepuriL.E.: Nu citisem comentariul lui Vlad. 
|
|
|
|
|
Memorat
|
|
|
|
|
•Cosmin
|
 |
« Răspunde #7 : August 18, 2011, 22:20:09 » |
|
Ma interesa complexitatea algoritmului cel mai bun.
|
|
|
|
|
Memorat
|
|
|
|
•tudalex
Strain
Karma: -8
Deconectat
Mesaje: 44
|
 |
« Răspunde #8 : August 25, 2011, 21:21:29 » |
|
Se mai poate si preprocesa folosind templateuri in C++ [ 0 ], avand apoi O(1) per query. Daca ai in mod ipotetic timp constant pe adunari si inmultiri cea mai rapida metode sa folosesti ridicare la putere in timp logaritmic [ 1 ] folosind o matrice de ordin 2, complexitatea fiind de O(log N). Lucru mentionat si de ceilalti care au postat mai sus. [ 0 ] - http://blog.emptycrate.com/node/271 (primul link gasit pe google, sigur sunt numeroase metode de a face asta) [ 1 ] - http://infoarena.ro/problema/lgput
|
|
|
|
« Ultima modificare: August 25, 2011, 22:06:35 de către FMI - Paul-Dan Baltescu »
|
Memorat
|
"Doua lucruri sunt infinite: universul si prostia omeneasca, dar de prima inca nu sunt sigur" Albert Einstein
|
|
|
|
•Cosmin
|
 |
« Răspunde #9 : August 27, 2011, 03:57:26 » |
|
Preprocesarea e o idee, nu conteaza daca o faci folosind templateuri sau altfel. Folosirea acestei idei triseaza scopul problemei, pentru ca tot platesti timpul undeva.
Asa cum am zis si mai sus, raspunsul O(log N) e gresit, pentru ca rezultatul va avea multe cifre. Destul de repede vei avea nevoie sa implementezi numere mari pentru care operatiile de adunare, inmultire ... nu ruleaza in timp constant.
Vlad e mai aproape de raspuns, dar nici el nu mi-a zis complexitatea algoritmului lui. Oricum exista algoritm mai bun.
|
|
|
|
« Ultima modificare: August 27, 2011, 08:29:08 de către Cosmin Negruseri »
|
Memorat
|
|
|
|
•proflaurian
Client obisnuit

Karma: 46
Deconectat
Mesaje: 58
|
 |
« Răspunde #10 : August 29, 2011, 17:21:12 » |
|
Complexitatea la care te gandesti e ceva de forma O( na ) unde a e prin apropiere de 1,7 ?
|
|
|
|
|
Memorat
|
|
|
|
•proflaurian
Client obisnuit

Karma: 46
Deconectat
Mesaje: 58
|
 |
« Răspunde #11 : August 29, 2011, 17:46:04 » |
|
Scuze. Am aruncat o vorba fara nicio explicatie. Eu ma gandeam la ceva recursiv pe metoda urmatoare:
(Fm+n,Fm+n-1)=( FmFn+Fm-1Fn+FmFn-1 , FmFn+Fm-1Fn-1)
De aici
(F2k,F2k-1)=( Fk2+2FkFk-1 , Fk2+Fk-12)
si
(F2k+1,F2k)=( F2k+F2k-1,F2k)
Astfel se obtine ceva similar cu ce spunea Vlad. La fiecare pas, n se injumatateste si se aplica operatii de inmultire si adunare care duc la complexitate L2 ( unde L este numarul de cifre n/log n ). Sumand aceste complexitati mie imi da ceva de genul O ( n1,7 ) .
|
|
|
|
|
Memorat
|
|
|
|
|
•Vman
|
 |
« Răspunde #12 : August 29, 2011, 20:17:16 » |
|
sa incerc o estimare... rezultatul va tinde catre 2^n, deci va avea n biti, deci n/logn cifre. Din cate am citit ar exista un algoritm de inmultire in O(c log c), deci o inmultire ar dura n / log n * log (n / log n) = n / log n * (log n - log log n) = n - n log log n / log n, rezulta o complexitate finala de n^2 log n 
|
|
|
|
|
Memorat
|
|
|
|
|
•Cosmin
|
 |
« Răspunde #13 : August 30, 2011, 03:20:22 » |
|
Algoritmul naiv in care folosesti numere mari si le aduni unu cate unu ia O(n^2/log^2 n) timp.
@Adrian ai gresit pe la calcule. La ultimul pas inmultesti numere de O(n/log n) cifre in L^2 deci algoritmul ia cel putin O(n^2/log^2 n) care e mai mare decat O(n^1.7). Acuma vezi ca algoritmul ce nu foloseste o inmultire eficienta ca pas intermediar nu bate algoritmul naiv.
@Vlad ai bushit ceva. Algoritmul tau ar trebui sa fie mai rapid decat cel naiv.
|
|
|
|
« Ultima modificare: August 30, 2011, 04:54:07 de către Cosmin Negruseri »
|
Memorat
|
|
|
|
|
•Vman
|
 |
« Răspunde #14 : August 30, 2011, 11:47:47 » |
|
asa e, am un n in plus acolo la final, de fapt complexitatea la mine e O(N log N)
|
|
|
|
|
Memorat
|
|
|
|
|
•Cosmin
|
 |
« Răspunde #15 : August 31, 2011, 02:30:27 » |
|
@Vlad tot iti lipseste o observatie. La pasul i avem numere de 2^i / log n cifre. Daca sumezi costul inmultirilor vezi ca ajungi la O(n) ca si complexitate finala. Complexitatea e putin mai mare de O(n) pentru ca algoritmul cel mai bun de inmultire pe numere mari cunoscut are complexitatea Θ(n log(n) 2^Θ(log*(n)) ( http://en.wikipedia.org/wiki/Multiplication_algorithm).
|
|
|
|
|
Memorat
|
|
|
|
•proflaurian
Client obisnuit

Karma: 46
Deconectat
Mesaje: 58
|
 |
« Răspunde #16 : Septembrie 02, 2011, 20:51:56 » |
|
Eu am facut afirmatia cu n 1,7 plecand de la un calcul aproximativ al sumei din (2 k/k) 2 pentru k < log n folosind n cu 10-20 de cifre. Am refacut cu n avand mult mai multe cifre ( pana la 200) si dupa socotelile mele se ajunge cam la n 2. Nu afirm ca asta e raspunsul corect, e doar o parere bazata pe calcule destul de aproximative  Am folosit urmatoru cod: #include <iostream> #include<cmath> using namespace std;
int main() { int i; long double n=1,N,C,S=0,EXP; for(i=1;i<200;i++)n*=10; for(N=n/2;N>=2;N/=2) { C=N/log(N); C*=C; S+=C; } EXP=log(S)/log(n); cout << EXP; return 0; }
|
|
|
|
« Ultima modificare: Septembrie 02, 2011, 21:00:35 de către Panaete Adrian »
|
Memorat
|
|
|
|
|