Karim Belabas on Sat, 17 Sep 2005 18:20:01 +0200 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
Re: polsturm() slower |
* Igor Schein [2005-08-12 01:04]: > Hi, > > ? polsturm(pollegendre(5!)); > time = 2,350 ms. > ? polroots(pollegendre(5!)); > time = 180 ms. > > Any reason why polsturm is so much slower? I understand that former > is doing more than latter, but I can't image it doing that much more. Actually, no. Polroots is much more complicated than polsturm. (OK, orthogonal polynomials are totally real, so in this case one could immensely simplify polroots, but I'm speaking of the general case.) The main reason for the speed difference is that polroots uses intricate pertubation results so as to deal with just enough significant digits to solve the problem, whereas polsturm handles gigantic integers in exact arithmetic (imagine the remainder sequence for your input...). Compare: (17:49) gp > polsturm(pollegendre(5!)) time = 15,274 ms. %1 = 120 (17:50) gp > polsturm(pollegendre(5!) * 1.) time = 5 ms. %2 = 52 \\ very wrong... (17:50) gp > \p100 realprecision = 105 significant digits (100 digits displayed) (17:50) gp > polsturm(pollegendre(5!) * 1.) time = 16 ms. %3 = 120 \\ OK now Guillaume Hanrot wrote an implementation of Uspensky's method (faster than Sturm, but still slower than polroots at low accuracies) some time ago, but I haven't received a final version yet. Cheers, Karim. -- Karim Belabas Tel: (+33) (0)5 40 00 26 17 Universite Bordeaux 1 Fax: (+33) (0)5 40 00 69 50 351, cours de la Liberation http://www.math.u-bordeaux.fr/~belabas/ F-33405 Talence (France) http://pari.math.u-bordeaux.fr/ [PARI/GP]