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.

Reply via email to