Sorry, "multiprecision word" should have read "multiprecision (multiword) integer" of course.
Bill. On 22 September 2013 22:12, Bill Hart <goodwillh...@googlemail.com> wrote: > mpn_mod_1 only computes remainder after division by a single word, whereas > mpn_tdiv_qr computes remainder after division by a multiprecision word. > > However, as implemented, mpn_mod_1 does not compute the quotient, only the > remainder. It uses a fantastic algorithm due to Montgomery. Thus it is very > fast. > > Bill. > > > On 22 September 2013 21:58, mgundes <mg...@hotmail.com> wrote: > >> Thanks Bill, really appreciated your brief answer. >> >> I have one more question. I need the quotient so that I use >> mpn_tdiv_qr. However when I replace mpn_tdiv_qr() with mpn_mod_1() >> it is too much faster about 2-3 times. mpn_mod_1() returns remineder >> which means it also can calculate quotient too, right? Then why it is >> that faster than mpn_tdiv_qr()? Any idea? >> >> Thanks, >> Regards. >> >> >> On Sun, Sep 22, 2013 at 11:28 PM, Bill Hart <goodwillh...@googlemail.com> >> wrote: >> > Yes, there's a few things you can do to speed it up. >> > >> > * You don't need to memset to 0. The mpn_tdiv_qr function writes over >> what >> > is there (I hope). >> > >> > * The latest trunk branch in my git repo has slightly faster division >> code >> > (10-20%) over a good range. >> > >> > * If you are reducing many values by the same modulus, you would be >> better >> > to compute a precomputed inverse and multiply by it, instead of doing a >> > division. See [1] for a good algorithm. Also see [2] and [3] for >> > implementations of division with precomputed inverse. Look in the test >> > subdirectory there to see examples of use. I don't promise that this is >> the >> > best way to do things, and I don't recall which implementation is >> faster. >> > >> > * You may get some ideas from Modern Computer Arithmetic [4] >> > >> > * You may also want to look at Montgomery's REDC algorithm, depending on >> > your application. >> > >> > A lot depends on your precise application and how big the operands are. >> > >> > Speeding this sort of thing up is an active area of research, so there >> are >> > many, many possibilities out there. >> > >> > Bill. >> > >> > [1] http://gmplib.org/~tege/division-paper.pdf >> > >> > [2] >> https://github.com/wbhart/flint2/blob/trunk/mpn_extras/mulmod_preinv1.c >> > >> > [3] >> https://github.com/wbhart/flint2/blob/trunk/mpn_extras/mulmod_preinvn.c >> > >> > [4] http://www.loria.fr/~zimmerma/mca/pub226.html >> > >> > >> > On 22 September 2013 21:08, mgundes <mg...@hotmail.com> wrote: >> >> >> >> Hello everyone, >> >> >> >> I am trying to do "a*b mod n" operation with big numbers. I have >> >> written a function which is working fine but I am wondering if I can >> >> make it faster. >> >> >> >> Do you have any advice about speed up function below? >> >> Thanks a lot, >> >> Regards. >> >> >> >> >> >> /* >> >> "(a * b) mod p" operation with mpir functions >> >> */ >> >> void MpirMultiplyModReduct(const mp_limb_t *a, const mp_limb_t *b, >> >> mp_size_t size, const mp_limb_t *mod) >> >> { >> >> mp_limb_t multiplicationResult[size*2]; >> >> memset(multiplicationResult, 0, size*2 * sizeof(mp_limb_t)); >> >> >> >> mp_limb_t c[size]; >> >> memset(c, 0, size * sizeof(mp_limb_t)); >> >> >> >> mp_limb_t d[size]; >> >> memset(d, 0, size * sizeof(mp_limb_t)); >> >> >> >> mpn_mul(multiplicationResult, a, size, b, size); >> >> mpn_tdiv_qr(c, d, 0, multiplicationResult, 2*size, mod, size); >> >> } >> >> >> >> >> >> >> >> -- >> >> MahmutG >> >> >> >> -- >> >> You received this message because you are subscribed to the Google >> Groups >> >> "mpir-devel" group. >> >> To unsubscribe from this group and stop receiving emails from it, send >> an >> >> email to mpir-devel+unsubscr...@googlegroups.com. >> >> To post to this group, send email to mpir-devel@googlegroups.com. >> >> Visit this group at http://groups.google.com/group/mpir-devel. >> >> For more options, visit https://groups.google.com/groups/opt_out. >> > >> > >> > -- >> > You received this message because you are subscribed to the Google >> Groups >> > "mpir-devel" group. >> > To unsubscribe from this group and stop receiving emails from it, send >> an >> > email to mpir-devel+unsubscr...@googlegroups.com. >> > To post to this group, send email to mpir-devel@googlegroups.com. >> > Visit this group at http://groups.google.com/group/mpir-devel. >> > For more options, visit https://groups.google.com/groups/opt_out. >> >> >> >> -- >> MahmutG >> >> -- >> You received this message because you are subscribed to the Google Groups >> "mpir-devel" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to mpir-devel+unsubscr...@googlegroups.com. >> To post to this group, send email to mpir-devel@googlegroups.com. >> Visit this group at http://groups.google.com/group/mpir-devel. >> For more options, visit https://groups.google.com/groups/opt_out. >> > > -- You received this message because you are subscribed to the Google Groups "mpir-devel" group. To unsubscribe from this group and stop receiving emails from it, send an email to mpir-devel+unsubscr...@googlegroups.com. To post to this group, send email to mpir-devel@googlegroups.com. Visit this group at http://groups.google.com/group/mpir-devel. For more options, visit https://groups.google.com/groups/opt_out.