
#else // USE_SIGNED_MOD_T


//#define U_MODULUS  (umod_t)(mod_modulus)

inline smod_t
mul_mod_mod(const smod_t a, const smod_t b)
//
// on output:
// quot == (a*b)/modulus
// rem  == (a*b)%modulus
//
//
{
//    assert( mod::m1d!=0.0 );

//#if  ( MOD_PARANOIA )
//    assert( (smod_t)a>=0 );
//    assert( (smod_t)b>=0 );
//#endif

    // high bits (float mult):
    umod_t quot = (umod_t)((long double)a*(long double)b*(M1DD)+(long double)0.5);

    // low bits (integer mult):
    umod_t ab = (umod_t)a * (umod_t)b;
    umod_t mq = (umod_t)MODULUS * (umod_t)quot;

//#if  ( MOD_PARANOIA )
//    assert( (smod_t)quot>=0 );
//    assert( (smod_t)quot<MODULUS );
//#endif

    smod_t rem = (smod_t)(ab-mq);
    while ( rem<0 )
    {
	rem += MODULUS;
	quot--;
    }


#if  ( MOD_PARANOIA )
    assert( (smod_t)rem>=0 );
    assert( (mod_t)rem<MODULUS );
#endif

    return  rem;
}
// ============ end MUL_MOD_MOD ===========


#endif // USE_UNSIGNED_MOD_T
