/*
Copyright (C) 2010 Sebastian Pancratz
This file is part of FLINT.
FLINT is free software: you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License (LGPL) as published
by the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version. See .
*/
#ifndef LONG_EXTRAS_H
#define LONG_EXTRAS_H
#ifdef LONG_EXTRAS_INLINES_C
#define LONG_EXTRAS_INLINE FLINT_DLL
#else
#define LONG_EXTRAS_INLINE static __inline__
#endif
#include
#include "flint.h"
#include "longlong.h"
#ifdef __cplusplus
extern "C" {
#endif
/* Properties ****************************************************************/
FLINT_DLL size_t z_sizeinbase(slong n, int b);
/* Checked arithmetic ********************************************************/
LONG_EXTRAS_INLINE int z_mul_checked(slong * a, slong b, slong c)
{
/* TODO __builtin_mul_overflow */
ulong ahi, alo;
smul_ppmm(ahi, alo, b, c);
*a = alo;
return FLINT_SIGN_EXT(alo) != ahi;
}
LONG_EXTRAS_INLINE int z_add_checked(slong * a, slong b, slong c)
{
/* TODO __builtin_add_overflow */
int of = (b > 0 && c > WORD_MAX - b) || (b < 0 && c < WORD_MIN - b);
*a = b + c;
return of;
}
LONG_EXTRAS_INLINE
int z_mat22_det_is_negative(slong m11, slong m12, slong m21, slong m22)
{
ulong t1, t2, t3, t4;
smul_ppmm(t1, t2, m11, m22);
smul_ppmm(t3, t4, m12, m21);
sub_ddmmss(t1, t2, t1, t2, t3, t4);
return FLINT_SIGN_EXT(t1) != 0;
}
/* Randomisation ************************************************************/
FLINT_DLL mp_limb_signed_t z_randtest(flint_rand_t state);
FLINT_DLL mp_limb_signed_t z_randtest_not_zero(flint_rand_t state);
FLINT_DLL mp_limb_signed_t z_randint(flint_rand_t state, mp_limb_t limit);
/*****************************************************************************/
FLINT_DLL int z_kronecker(slong a, slong n);
#ifdef __cplusplus
}
#endif
#endif