-
Notifications
You must be signed in to change notification settings - Fork 205
Improve mp_root_n code #532
New issue
Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? # to your account
base: develop
Are you sure you want to change the base?
Conversation
@czurnieden could you maybe have a look if you have the time? You've added parts of the removed code in 984d3ff and I'm not sure whether this should/can really be removed. |
I based it on the development branch. I thought it was more up to date. |
I don't know if it is how readable in this form: Starting with x[i+1] = x[i] - f(x[i])/f'(x[i]), where f(x) = x^b - a So x[i+1] = x[i] - (x[i] ^ b - a) / ( b * x[i] ^ (b-1) ) (this is in the code) When x[i] ^ b > a, x[i+1] will be rounded up. Algebraically: Hence the code removal (unless I'm missing something...). |
It's too warm too sleep, so here we go:
That was three years ago! But I appreciate your optimism regarding my long-term memory ;-) I am sure that I did no proper analysis, so there are some places with…let's call it "belt&girdle" code. The start-value gets calculated based on the equality With addition of unity we get the inequality I'm not sure anymore why I added the loop but I also had some code to find a more exact start-value by doing some rounds of bisection (works well for larger bases and also a little bit for smaller bases but it adds a lot of code and nobody wanted it ;-) ), so it might be a leftover from that experiment. But no matter the exact reason: it is superfluous code in case of One last question: are you, @ssinai1 sure that the main loop cannot oscillate? |
Thanks for the explanation. My reasoning is as follows: This means that not only is As for the second part of the question: |
What is that in lines 110ff? Ouch! How could that have slipped through the tests for over three years? But while we are at it: If we can assume that the error is at most one with a start-value of Is that correct? |
I rewrote it for downward rounding iteration. The mp_div seems to round towards 0, so it needed the remainder... |
No, it is truncating! E.g.: both But I like where it is going to! Thanks for the work! BTW: Libtommath is not as frugal as it looks from the outside, it has some useful macros in
These are a bit cheaper than a full call to If I understood it correctly
That macro is not in |
Anyway, in this case a division rounding to negative infinity would be more practical. |
Do you use this often inside the library or in code using libtommath? IMO it'd be fine to go in either of |
Mainly externally, so |
Sorry @ssinai1 for highjacking your PR for this discussion :) I've created #537 for that purpose now. We should continue with this question #532 (comment) now :) (and by 'we' I mostly mean @ssinai1 and @czurnieden :D thanks) |
October 2022. Oh, my, completely forgotten, sorry! @ssinai1 if you are still out there: could you please rebase this PR to the current develop branch so I can give it my "seal of approval"? Thank you very much! |
@ssinai1 Can you please rebase on top of develop, squash those commits and write a bit of a commit message which summarizes what was done. |
Set a closer initial value for iteration and remove some unnecessary code.
By the way, in the first for loop, one of the err=MP_OKAY branches (never reached) did not set c.