Thank you Bill.

Regards.

On Mon, Sep 23, 2013 at 12:13 AM, Bill Hart <goodwillh...@googlemail.com> wrote:
> 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.



-- 
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.

Reply via email to