I've finally managed to get the divide and conquer integer division code I've been working on into MPIR. The test code is now passing, though I will need to do some more testing.
Below are timings for divapprox code in GMP and the new code. I've included the best timings out of basecase and divide and conquer in each case;
new code DIVAPPR
size = 3: classical = 5.7e-08s,
size = 4: classical = 7.5e-08s,
size = 5: classical = 9.7e-08s,
size = 6: classical = 1.17e-07s,
size = 7: classical = 1.41e-07s,
size = 8: classical = 1.65e-07s,
size = 9: classical = 1.89e-07s,
size = 10: classical = 2.14e-07s,
size = 11: classical = 2.38e-07s,
size = 13: classical = 2.92e-07s,
size = 15: classical = 3.64e-07s,
size = 17: classical = 4.28e-07s,
size = 19: classical = 4.89e-07s,
size = 21: classical = 5.96e-07s,
size = 24: classical = 7.25e-07s,
size = 27: classical = 8.7e-07s,
size = 30: classical = 1.043e-06s,
size = 33: classical = 1.2e-06s,
size = 37: classical = 1.475e-06s,
size = 41: classical = 1.8e-06s,
size = 46: divconquer = 2.14e-06s
size = 51: divconquer = 2.59e-06s
size = 57: divconquer = 3.1e-06s
size = 63: divconquer = 3.77e-06s
size = 70: divconquer = 4.46e-06s
size = 77: divconquer = 5.19e-06s
size = 85: divconquer = 6.06e-06s
size = 94: divconquer = 6.89e-06s
size = 104: divconquer = 8.2e-06s
size = 115: divconquer = 9.6e-06s
size = 127: divconquer = 1.16e-05s
size = 140: divconquer = 1.36e-05s
size = 154: divconquer = 1.57e-05s
size = 170: divconquer = 1.83e-05s
size = 188: divconquer = 2.11e-05s
size = 207: divconquer = 2.5e-05s
size = 228: divconquer = 2.9e-05s
size = 251: divconquer = 3.47e-05s
size = 277: divconquer = 4.09e-05s
size = 305: divconquer = 4.69e-05s
size = 336: divconquer = 5.63e-05s
size = 370: divconquer = 6.24e-05s
size = 407: divconquer = 7.4e-05s
size = 448: divconquer = 8.6e-05s
size = 493: divconquer = 0.000103s
size = 543: divconquer = 0.000121s
size = 598: divconquer = 0.000142s
size = 658: divconquer = 0.000164s
size = 724: divconquer = 0.000185s
size = 797: divconquer = 0.000221s
size = 877: divconquer = 0.000253s
size = 965: divconquer = 0.000294s
gmp-5.1.1 DIVAPPR
size = 3: classical = 6.7e-08s,
size = 4: classical = 8.8e-08s,
size = 5: classical = 1.13e-07s,
size = 6: classical = 1.36e-07s,
size = 7: classical = 1.85e-07s,
size = 8: classical = 1.95e-07s,
size = 9: classical = 2.27e-07s,
size = 10: classical = 2.51e-07s,
size = 11: classical = 2.98e-07s,
size = 13: classical = 3.54e-07s,
size = 15: classical = 4.35e-07s,
size = 17: classical = 5.07e-07s,
size = 19: classical = 6.07e-07s,
size = 21: classical = 7.05e-07s,
size = 24: classical = 8.35e-07s,
size = 27: classical = 1.052e-06s,
size = 30: classical = 1.233e-06s,
size = 33: classical = 1.447e-06s,
size = 37: classical = 1.719e-06s,
size = 41: classical = 2e-06s,
size = 46: classical = 2.4e-06s,
size = 51: classical = 2.81e-06s,
size = 57: classical = 3.38e-06s,
size = 63: classical = 3.97e-06s,
size = 70: classical = 4.67e-06s,
size = 77: classical = 5.45e-06s,
size = 85: classical = 6.38e-06s,
size = 94: classical = 7.48e-06s,
size = 104: classical = 8.9e-06s,
size = 115: classical = 1.04e-05s,
size = 127: classical = 1.25e-05s,
size = 140: classical = 1.46e-05s,
size = 154: classical = 1.72e-05s,
size = 170: classical = 2.05e-05s,
size = 188: classical = 2.43e-05s,
size = 207: classical = 2.9e-05s,
size = 228: classical = 3.45e-05s,
size = 251: divconquer = 4.07e-05s
size = 277: divconquer = 4.8e-05s
size = 305: divconquer = 5.6e-05s
size = 336: divconquer = 6.47e-05s
size = 370: divconquer = 7.63e-05s
size = 407: divconquer = 9e-05s
size = 448: divconquer = 0.000104s
size = 493: divconquer = 0.000123s
size = 543: divconquer = 0.000143s
size = 598: divconquer = 0.000166s
size = 658: divconquer = 0.000193s
size = 724: divconquer = 0.000224s
size = 797: divconquer = 0.000265s
size = 877: divconquer = 0.000305s
size = 965: divconquer = 0.000358s
So it looks like the new code is most often about 20% faster than GMP.
The main things that remain to be done now are:
* further testing
* switch all precomputed inverses in MPIR over to the new ones (actually test code passes either way because the precomputed inverses are rarely different, but we have to change them obviously)
* remove the file mpn/generic/dc_divappr_q_n.c which I believe is no longer needed
* write speed and tuning code for the new cutoffs (they are currently hard coded)
Once I've done the first three I'll merge into trunk. They may or may not take a while to do depending on how the testing goes.
I plan to work on a new release of MPIR after May 12th (I am running a flint workshop from 4-12 May). We have a long list of bugs and tickets which need to be resolved, many of which have been reported by the Sage project.
Bill.