On Sun, Aug 21, 2011 at 5:37 PM, David Cleaver <wrai...@morpheus.net> wrote:
> Hello all,
>
> Not too long ago I needed some mathematical functions that I couldn't really
> find implemented anywhere.  I eventually stumbled on someone's
> implementation and was able to code it up with GMP.  I was wondering, would
> there be any interest in including these functions in the official MPIR?
>  The functions are the Lucas U and Lucas V sequences, defined with
> parameters p and q.  Here are the prototypes:
>
> int mpz_lucasu(mpz_t rop, long int p, long int q, mpz_t k)
> int mpz_lucasumod(mpz_t rop, long int p, long int q, mpz_t k, mpz_t n)
> int mpz_lucasv(mpz_t rop, long int p, long int q, mpz_t k)
> int mpz_lucasvmod(mpz_t rop, long int p, long int q, mpz_t k, mpz_t n)
>
> You can download the code at the sourceforge site:
> http://sourceforge.net/projects/mpzlucas/files/

I don't know if they're appropriate for MPIR. They would be really
nice to have in FLINT (http://flintlib.org/), where we already have
some functionality for generating special number sequences. Your code
should also run quite a bit faster for small to moderate k (k < 100?)
if ported to the fmpz type in FLINT.

Is there a reason not to allow p and q to be mpz's? It seems entirely
reasonable to me to allow bignum coefficients, and it shouldn't really
affect performance. Conversely, why is k an mpz in
mpz_lucasu/mpz_lucasv? It makes sense in the mod versions, but
otherwise I don't think the result can fit in memory for k larger than
a long, except in the trivial case p = q = 0.

> Along with these Lucas functions, I'd also like to propose that we add
> several new prp functions to the official MPIR library.  Here are the
> prototypes for the new prp functions:
>
> int mpz_prp(mpz_t n, mpz_t a) aka: Fermat pseudoprime
> int mpz_euler_prp(mpz_t n, mpz_t a) aka: Solovay-Strassen pseudoprime
> int mpz_sprp(mpz_t n, mpz_t a) aka: Miller-Rabin pseudoprime
> int mpz_fibonacci_prp(mpz_t n, long int p, long int q)
> int mpz_lucas_prp(mpz_t n, long int p, long int q)
> int mpz_stronglucas_prp(mpz_t n, long int p, long int q)
> int mpz_extrastronglucas_prp(mpz_t n, long int p)
> int mpz_selfridge_prp(mpz_t n) aka: Lucas-Selfridge pseudoprime
> int mpz_strongselfridge_prp(mpz_t n) aka: strong Lucas-Selfridge pseudoprime
> int mpz_bpsw_prp(mpz_t n)
> int mpz_strongbpsw_prp(mpz_t n)
>
> Where each function can return one of:
> #define PRP_ERROR -1
> #define PRP_COMPOSITE 0
> #define PRP_PRP 1
> #define PRP_PRIME 2

This kind of functionality would again probably be welcome in FLINT
(where we plan to add more extensive support for primality testing and
factoring) if not in MPIR itself. A couple of these primality tests
are already implemented very efficiently for word-size numbers in
FLINT, I think.

Regarding the interface, I would generally just make these functions
raise an exception if the parameters are invalid, instead of returning
an error code.

Fredrik

-- 
You received this message because you are subscribed to the Google Groups 
"mpir-devel" group.
To post to this group, send email to mpir-devel@googlegroups.com.
To unsubscribe from this group, send email to 
mpir-devel+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/mpir-devel?hl=en.

Reply via email to