I forgot to mention. The ngcd, sgcd and gcd algorithms all return the same result, so it appears they are all correct at least.
Bill. 2008/12/21 Bill Hart <goodwillh...@googlemail.com>: > I hacked some hooks into gmp.h to export mpz_sgcd and mpz_ngcd. Both > of these functions run in the right amount of time. > > I think the mpn_gcd is just broken. I don't see why we shouldn't just > use ngcd for now. > > Don't quote me on this, but one possibility is that mpn_gcd still > implements Weber's algorithm, but a subordinate part of it is using > the ngcd_lehmer algorithm. This appears to make sense as the code runs > some of the existing code if a certain threshold is passed, but always > runs the ngcd_lehmer code. > > That would seem to imply that the algorithm was originally designed to > break the problem down somewhat (I don't know much about Weber's > algorithm, but it does some kind of k-ary reduction and an nmod step, > then feeds it to a simpler gcd algorithm as a basecase. It is the > binary gcd algorithm, used as a simpler gcd algorithm which has been > replaced by ngcd_lehmer in Moller's patches for mpn_gcd. See Weber's > paper for details: > > http://raider.muc.edu/cs/cs492/samples/sce_blog/linked_files/Weber_Presentation_Paper.pdf > > Of course the Weber algorithm supposedly runs about 5 times faster > than a binary gcd algorithm and so the idea may be that for smaller > inputs Weber + ngcd will be faster than Weber + binary and even faster > than ngcd. But for large inputs ngcd will win due to the subquadratic > asymptotics. > > Anyhow, there appears to be no reason why one can't just call mpn_ngcd > directly for large enough inputs, bypassing the Weber reduction. As > you've noted though, over a certain range of small inputs, Weber + > ngcd is slower than Weber + binary gcd. > > Of course I may have this all mixed up. I have only taken a brief look. > > If we only end up using ngcd (quite possible), we should get rid of > all the others (sgcd, bgcd, etc) as Moller reports in his paper that > they are all inferior to his ngcd. > > Bill. > > 2008/12/21 Bill Hart <goodwillh...@googlemail.com>: >> There is a graph of expected performance on page 16 of Moller's paper: >> >> http://www.lysator.liu.se/~nisse/archive/S0025-5718-07-02017-0.pdf >> >> It looks like the ngcd algorithm is supposed to be the fastest. But it >> is still clear from the graph that at 1 million bits ngcd is >> dramatically faster than the accelerated gcd, like 10 times faster. >> Something is wrong somewhere. >> >> Perhaps the version of the patches on Moller's site is broken. But >> presumably this is the code he used to construct the timings for his >> paper. >> >> Bill. >> >> 2008/12/21 Bill Hart <goodwillh...@googlemail.com>: >>> I see why it is faster. There is a #define in the accelerated gcd >>> algorithm switching out some of the old code. Now a function called >>> mpn_ngcd_lehmer is called. >>> >>> This is one of Moller's functions, presumably implementing his "new >>> half gcd algorithm". According to his paper this is supposed to be >>> faster than the half gcd algorithm of Schoenhage. >>> >>> Now I have no idea what is going on. >>> >>> Bill. >>> >>> 2008/12/21 Bill Hart <goodwillh...@googlemail.com>: >>>> The function mpz_gcd is defined in the file /mpz/gcd. In the latest >>>> revision of MPIR it invokes a macro GCD_BODY(mpn_gcd). This macro is >>>> just a generic wrapper for an mpn_gcd like function. It can be invoked >>>> with any function which observes the syntax of mpn_gcd as a parameter. >>>> But currently mpz_gcd is invoked with parameter mpn_gcd. >>>> >>>> mpn_gcd is defined in the file /mpn/generic/gcd.c. Currently it >>>> implements the algorithm known as the accelerated gcd algorithm: >>>> >>>> K. Weber, The accelerated integer GCD algorithm, ACM Transactions on >>>> Mathematical Software, v. 21 (March), 1995, pp. 111-122. >>>> >>>> as implemented by Ken Weber in 2002. It does *NOT* use Moller's >>>> patches or a half gcd algorithm. >>>> >>>> Instead, mpn_gcd should be modified to actually call mpn_hgcd. >>>> >>>> As you say, it may be possible to have some kind of tuned wrapper >>>> which chooses the best algorithm depending on the input. >>>> >>>> I don't know why mpz_gcd is currently faster than it used to be. >>>> Perhaps some other difference in our code base accounts for that. >>>> >>>> The whole point is, Moller's algorithm is a half gcd algorithm. This >>>> is asymptotically faster than the accelerated gcd algorithm (it is >>>> subquadratic). This means that as the sizes increase the distance >>>> between the before and after timings should become more and more >>>> dramatic. >>>> >>>> One person that might be able to help is Moller. He seemed nice enough >>>> when I spoke to him via email. I don't know what the intended usage of >>>> his functions is, and I haven't checked to see how well documented >>>> they are. Presumably one wouldn't call hgcd when one of the inputs is >>>> very small and the other very large. There also appear to be numerous >>>> other functions in his files and I haven't looked at his documentation >>>> or paper to see what situations they are supposed to be advantageous >>>> in. >>>> >>>> I kind of assumed that you were sorting all this out. >>>> >>>> Bill. >>>> >>>> 2008/12/21 Jason Martin <jason.worth.mar...@gmail.com>: >>>>> >>>>> What about the figures? I see that the new mpn_gcd is faster than the >>>>> GMP v. 4.2 mpn_gcd. >>>>> >>>>> I'm confused about what you want me to do. I thought the assignment >>>>> was to put Moller's v2.1 patches into MPIR. I did that. The patches >>>>> are there and they DO show a difference with a high enough limb count. >>>>> >>>>> I can't use the Moller patches on the GMP webpage because they are GPL v. >>>>> 3. >>>>> >>>>> Jason Worth Martin >>>>> Asst. Professor of Mathematics >>>>> http://www.math.jmu.edu/~martin >>>>> >>>>> >>>>> >>>>> On Sat, Dec 20, 2008 at 7:12 PM, Bill Hart <goodwillh...@googlemail.com> >>>>> wrote: >>>>>> >>>>>> You need to look at the figures on the GMP website and look at the >>>>>> asymptotics. That has nothing to do with Magma. >>>>>> >>>>>> Bill. >>>>>> >>>>>> 2008/12/21 Jason Martin <jason.worth.mar...@gmail.com>: >>>>>>> >>>>>>>> By the way, the code you posted has a variable missing in the final >>>>>>>> printf. It always returns 0.00. >>>>>>> >>>>>>> Sorry, that was a version control issue. The numbers I posted below >>>>>>> are for correct code (with the "result" variable printed. >>>>>>> >>>>>>> I don't get the error message that you are reporting when building. >>>>>>> I'll try building on sage.math and see what happens. >>>>>>> >>>>>>> I'm also confused about what exactly you're saying the problem is. My >>>>>>> testing shows that for big enough numbers, the Moller patches in MPIR >>>>>>> are faster than the un-patched MPIR. I'm not comparing it against >>>>>>> Magma because I don't have any basis for the comparison. >>>>>>> >>>>>>> Perhaps you should send me the exact numbers you're talking about and >>>>>>> I'll try them with: >>>>>>> >>>>>>> MPIR rev 1487 (pre-patch) >>>>>>> MPIR current >>>>>>> and >>>>>>> GMP 4.2.4 >>>>>>> >>>>>>> --jason >>>>>>> >>>>>>> > >>>>>>> >>>>>> >>>>>> > >>>>>> >>>>> >>>>> >>>>> >>>>> >>>> >>> >> > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "mpir-devel" group. To post to this group, send email to mpir-devel@googlegroups.com To unsubscribe from this group, send email to mpir-devel+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/mpir-devel?hl=en -~----------~----~----~----~------~----~------~--~---