Compute bin_uiui via Flint for small n#383
Compute bin_uiui via Flint for small n#383albinahlback wants to merge 2 commits intoflintlib:masterfrom
Conversation
2e8b7f7 to
ed1d1cd
Compare
ed1d1cd to
41adb48
Compare
|
Sorry. Didn't include |
|
Does it fail because MPIR might be used? |
|
Does this look good @fredrik-johansson ? |
|
It's ok, but I'd like to see cutoffs based on n, k and the precision. Computing bin(n, k) via GMP should be faster even for huge n, if k is small or if log2(bin(n, k)) is less than some small multiple of prec. It would be nice if also arb_bin_ui called the same algorithm when n is a small integer. |
|
Yes, that's true! Thanks for your input. |
|
I haven't tested the code yet, but I think the thoughts are solid. I profiled with 10 bits in order to give the original code an advantage, and found that the bounds in the code are pretty good estimates for when the new version is faster. I had to do some extra code in case that |
|
|
||
| #define LOG2_BIN(n, k) \ | ||
| (-1.3257480647361592 \ | ||
| + ((n) + .5) * log2(n) \ |
There was a problem hiding this comment.
I think log2 might not be available everywhere. Better to use log.
There was a problem hiding this comment.
There was a problem hiding this comment.
What is your opinion about supporting/assuming newer standards?
There was a problem hiding this comment.
Might be needed at some point, but not worth risking any breakage right here.
| else | ||
| { | ||
| arf_struct atmp; | ||
| mag_struct mtmp = {0, 0}; |
There was a problem hiding this comment.
This level of code shouldn't be be written in a way that relies on the internal representation of structs.
| else if (k < (UWORD(1) << 32) && ((double) prec) < LOG2_BIN(n, k)) | ||
| { | ||
| mpz_t mres; | ||
| __mpz_struct mn = {1, 1, NULL}; |
There was a problem hiding this comment.
This level of code shouldn't be be written in a way that relies on the internal representation of structs.
Big speedup for smaller
nand increased precision due to not using floating point precision.Let me know if you want any timings for this.