Extending the mpn interface
David Harvey
d.harvey at unsw.edu.au
Fri Feb 15 20:13:47 CET 2013
Hi, I just want to add my strong support to the development of an mpz/mpn interface as you describe below. I have needed to do this kind of thing countless times, and I am always forced to compromise between efficiency and portability. This kind of interface will eliminate most of the compromise in most cases.
david
On Feb 16, 2013, at 1:51 AM, Niels Möller wrote:
> nisse at lysator.liu.se (Niels Möller) writes:
>
>> But I miss some features in the public interface to do this
>> conveniently; both for mpn <-> mpz interoperation, and there are also
>> some mpn functions which would be very useful but which are not part of
>> the public interface.
>
> I and Torbjörn had a little offline meeting after lunch today. Some
> conclusions:
>
> 1. We should add a minimal mpz/mpn interface.
>
> 2. We drop the _ from names.
>
> 3. We should be a bit more liberal in making mpn functions public.
>
> Below is a revised draft interface. Comments appreciated. I think I'll
> try to get this in fairly soon.
>
> I also plan to make additional mpn functions public when I need them,
> also with some advance warning to this list.
>
> PS. About use of mpz_t internals in gmp-h.in: I see a couple of uses of
> _mp_size, but *no* direct use of _mp_alloc.
>
> Regards,
> /Niels
>
> /* Second revision of a minimal mpz/mpn interface. Question: Should we
> use real functions, inline functions, or macros? */
>
> /* Read access to mpz numbers. */
>
> /* Return limb pointer, for read-only operations. Use mpz_size to get
> the number of limbs. */
> const mp_limb_t *
> mpz_read_limbs (const mpz_srcptr x);
>
> /* Write access to mpz numbers. */
>
> /* Get a limb pointer for writing, previous contents may be destroyed.
> Grows allocation if needed to make room for n limbs. */
> mp_limb_t *
> mpz_write_limbs (mpz_ptr x, mp_size_t n);
>
> /* Get a limb pointer for writing, previous contents is intact.
> Grows allocation if needed to make room for n limbs. */
> mp_limb_t *
> mpz_modify_limbs (mpz_ptr x, mp_size_t n);
>
> /* Adjusts the size after writing, to make x properly normalized. n <
> 0 means negative. Should have abs(n) <= the argument for the
> preceding mpz_write_limbs or mpz_modify_limbs. Never reallocates x,
> so the pointer from the earlier mpz_write_limbs/mpz_modify_limbs
> remains valid. */
> void
> mpz_finish_limbs (mpz_ptr x, mp_size_t n);
>
> /* Using an mpn number as an mpz. Can be used for read-only access
> only. x must not be cleared or reallocated. Here and below, xs
> stands for a signed parameter, where abs(xs) is the size, and xs <
> 0 indicates a negative number. Returns x, cast to const, so it can
> be used directly as an argument for other mpz functions. */
> mpz_srcptr
> mpz_init_mpn (mpz_ptr x, const mp_limb_t *xp, mp_size_t xs);
>
> /* Intializer for an mpz_t, having the same effect as calling
> mpz_init_mpn, but without a function call. It can be used to
> initialize variables which are statically allocated and/or const.
> xp would usually be a const mp_limb_t *, but unfortunately, it must
> then be cast to (mp_limb_t *) for use with this macro. */
> #define MPZ_MPN_INITIALIZER(xp, xs) { { 0, (xs), (xp) } }
>
>
>
> /* Some convenience functions, which we might want to add later. */
>
> /* Copy x, which must be at most xn limbs, to the {xp, xn} area,
> zero-padding if needed. Not sure what to do if x is too large to
> fit, or if x < 0. */
> void
> mpz_get_mpn (mp_limb_t *xp, mp_size_t xn, const mpz_t x);
>
> /* Assigns x from the area {xp, abs(xs)}. */
> void
> mpz_set_mpn (mpz_t x, const mp_limb_t *xp, mp_size_t xs);
>
> /* Compares an mpz value to an mpn value. */
> int
> mpz_cmp_mpn (const mpz_t x, const mp_limb_t *yp, mp_size_t ys);
>
> --
> Niels Möller. PGP-encrypted email is preferred. Keyid C0B98E26.
> Internet email is subject to wholesale government surveillance.
> _______________________________________________
> gmp-devel mailing list
> gmp-devel at gmplib.org
> https://gmplib.org/mailman/listinfo/gmp-devel
More information about the gmp-devel
mailing list