Exemplo n.º 1
0
int
elem_equal(elem_srcptr op1, elem_srcptr op2, const ring_t ring)
{
    switch (ring->type)
    {
        case TYPE_FMPZ:
            return fmpz_equal(op1, op2);

        case TYPE_LIMB:
            return *((mp_srcptr) op1) == *((mp_srcptr) op2);

        case TYPE_POLY:
            return elem_poly_equal(op1, op2, ring);

        case TYPE_MOD:
            return elem_equal(op1, op2, ring->parent);

        case TYPE_FRAC:
            return elem_equal(NUMER(op1, ring), NUMER(op2, ring), RING_NUMER(ring)) &&
                    elem_equal(DENOM(op1, ring), DENOM(op2, ring), RING_DENOM(ring));

        case TYPE_COMPLEX:
            return elem_equal(REALPART(op1, ring), REALPART(op2, ring), RING_PARENT(ring)) &&
                    elem_equal(IMAGPART(op1, ring), IMAGPART(op2, ring), RING_PARENT(ring));

        default:
            NOT_IMPLEMENTED("equal", ring);
    }
}
Exemplo n.º 2
0
void
elem_frac_poly_divrem(elem_ptr Q, elem_ptr R, elem_srcptr A, elem_srcptr B, const ring_t ring)
{
    if (elem_is_zero(B, ring))
    {
        printf("Exception: division by zero in elem_frac_poly_divrem\n");
        abort();
    }
    else if (Q == R)
    {
        printf("Exception: output arguments Q and R may not be aliased\n");
        abort();
    }
    else if (((const elem_poly_struct *) A)->length < ((const elem_poly_struct *) B)->length)
    {
        elem_set(R, A, ring);
        elem_zero(Q, ring);
    }
    else if (Q == A || Q == B)
    {
        elem_ptr tmp;
        ELEM_TMP_INIT(tmp, ring);
        elem_frac_poly_divrem(tmp, R, A, B, ring);
        elem_swap(Q, tmp, ring);
        ELEM_TMP_CLEAR(tmp, ring);
    }
    else if (R == B)
    {
        elem_ptr tmp;
        ELEM_TMP_INIT(tmp, ring);
        elem_frac_poly_divrem(Q, tmp, A, B, ring);
        elem_swap(R, tmp, ring);
        ELEM_TMP_CLEAR(tmp, ring);
    }
    else
    {
        /* if the denominators are the same as coefficients, we can do pseudo division */
        if (RING_DENOM(ring) == RING_PARENT(RING_NUMER(ring)))
        {
            _elem_frac_poly_divrem_wrap(NUMER(Q, ring), DENOM(Q, ring),
                NUMER(R, ring), DENOM(R, ring),
                NUMER(A, ring), DENOM(A, ring),
                NUMER(B, ring), DENOM(B, ring), RING_NUMER(ring), RING_DENOM(ring));
        }
        else
        {
            NOT_IMPLEMENTED("polynomial divrem with different denominator type", ring);
        }
    }
}
Exemplo n.º 3
0
Arquivo: prim.c Projeto: l0stman/loot
/* Return the product of two expressions */
static exp_t *
prod(exp_t *a1, exp_t *a2)
{
        exp_t *res;

        CHKNUM(a1, *);
        CHKNUM(a2, *);

        if (isfloat(a1) || isfloat(a2))
                res = nfloat(VALUE(a1) * VALUE(a2));
        else
                res = nrat(NUMER(a1) * NUMER(a2), DENOM(a1) * DENOM(a2));
        return res;
}
Exemplo n.º 4
0
Arquivo: prim.c Projeto: l0stman/loot
/* Return the division of two expressions */
static exp_t *
divs(exp_t *a1, exp_t *a2)
{
        exp_t *res;

        CHKNUM(a1, /);
        CHKNUM(a2, /);

        if (VALUE(a2) == 0)
                everr("/: argument is divided by zero", a1);
        if (isfloat(a1) || isfloat(a2))
                res = nfloat(VALUE(a1) / VALUE(a2));
        else
                res = nrat(NUMER(a1) * DENOM(a2), NUMER(a2) * DENOM(a1));
        return res;
}
Exemplo n.º 5
0
Arquivo: prim.c Projeto: l0stman/loot
/* Return the difference of two expressions */
static exp_t *
sub(exp_t *a1, exp_t *a2)
{
        long n1, n2, d1, d2;
        exp_t *res;

        CHKNUM(a1, -);
        CHKNUM(a2, -);

        if (isfloat(a1) || isfloat(a2))
                res = nfloat(VALUE(a1) - VALUE(a2));
        else {
                n1 = NUMER(a1), n2 = NUMER(a2);
                d1 = DENOM(a1), d2 = DENOM(a2);
                res = nrat(n1*d2 - n2*d1, d1 * d2);
        }
        return res;
}
Exemplo n.º 6
0
static char *lin_bid(card bid)
{
	static char buf[3];
	if (bid == bid_pass)
		return "p";
	else if (bid == bid_x)
		return "d";
	else if (bid == bid_xx)
		return "r";
	snprintf(buf, sizeof (buf), "%d%c", LEVEL(bid), "CDHSN"[DENOM(bid)]);
	return buf;
}
Exemplo n.º 7
0
void
elem_set(elem_ptr res, elem_srcptr src, const ring_t ring)
{
    if (res != src)
    {
        switch (ring->type)
        {
            case TYPE_FMPZ:
                fmpz_set(res, src);
                break;

            case TYPE_LIMB:
                *((mp_ptr) res) = *((mp_srcptr) src);
                break;

            case TYPE_MOD:
                elem_set(res, src, ring->parent);
                break;

            case TYPE_POLY:
                elem_poly_set(res, src, ring);
                break;

            case TYPE_FRAC:
                elem_set(NUMER(res, ring), NUMER(src, ring), RING_NUMER(ring));
                elem_set(DENOM(res, ring), DENOM(src, ring), RING_DENOM(ring));
                break;

            case TYPE_COMPLEX:
                elem_set(REALPART(res, ring), REALPART(src, ring), RING_PARENT(ring));
                elem_set(IMAGPART(res, ring), IMAGPART(src, ring), RING_PARENT(ring));
                break;

            default:
                NOT_IMPLEMENTED("set", ring);
        }
    }
}
Exemplo n.º 8
0
void
elem_set_si(elem_ptr elem, long v, const ring_t ring)
{
    switch (ring->type)
    {
        case TYPE_FMPZ:
            fmpz_set_si(elem, v);
            break;

        case TYPE_LIMB:
            *((mp_ptr) elem) = v;
            break;

        case TYPE_POLY:
            elem_poly_set_si(elem, v, ring);
            break;

        case TYPE_MOD:
            {
                switch (RING_PARENT(ring)->type)
                {
                    case TYPE_FMPZ:
                        fmpz_set_si(elem, v);
                        fmpz_mod(elem, elem, RING_MODULUS(ring));
                        break;

                    case TYPE_LIMB:
                        *((mp_ptr) elem) = nmod_set_si(v, ring->nmod);
                        break;

                    default:
                        NOT_IMPLEMENTED("set_si (mod)", ring);
                }
            }
            break;

        case TYPE_FRAC:
            elem_set_si(NUMER(elem, ring), v, RING_NUMER(ring));
            elem_one(DENOM(elem, ring), RING_DENOM(ring));
            break;

        case TYPE_COMPLEX:
            elem_set_si(REALPART(elem, ring), v, ring->parent);
            elem_zero(IMAGPART(elem, ring), ring->parent);
            break;

        default:
            NOT_IMPLEMENTED("set_si", ring);
    }
}
Exemplo n.º 9
0
void
elem_frac_canonicalise(elem_srcptr x, const ring_t ring)
{
    _elem_frac_canonicalise(NUMER(x, ring), DENOM(x, ring), RING_NUMER(ring), RING_DENOM(ring));
}
Exemplo n.º 10
0
double UNITS::ConvFactor() {
    
    bool InIsLinear=false, OutIsLinear=false;
    for (int i=ANG;i<=MPC;i++) {
        InIsLinear  = InIsLinear  || in==i;
        OutIsLinear = OutIsLinear || out==i;
    }
    if (InIsLinear && OutIsLinear) return LinearFactor();
    
    bool InIsTime=false, OutIsTime=false;
    for (int i=S;i<=GYR;i++) {
        InIsTime  = InIsTime  || in==i;
        OutIsTime = OutIsTime || out==i;
    }
    if (InIsTime && OutIsTime) return TimeFactor();
    
    bool InIsMass=false, OutIsMass=false;
    for (int i=GR;i<=MSUN;i++) {
        InIsMass  = InIsMass  || in==i;
        OutIsMass = OutIsMass || out==i;
    }
    if (InIsMass && OutIsMass) return MassFactor();
    
    bool InIsFreq=false, OutIsFreq=false;
    for (int i=HZ;i<=GHZ;i++) {
        InIsFreq  = InIsFreq  || in==i;
        OutIsFreq = OutIsFreq || out==i;
    }
    if (InIsFreq && OutIsFreq) return FrequencyFactor();
    
    bool InIsAngle=false, OutIsAngle=false;
    for (int i=DEG;i<=RAD;i++) {
        InIsAngle  = InIsAngle  || in==i;
        OutIsAngle = OutIsAngle || out==i;
    }
    if (InIsAngle && OutIsAngle) return AngleFactor();
    
    bool InIsVel=false, OutIsVel=false;
    for (int i=CM_S;i<=KM_H;i++) {
        InIsVel  = InIsVel  || in==i;
        OutIsVel = OutIsVel || out==i;
    }
    if (InIsVel && OutIsVel) {
        Unit NumIn=M, NumOut=M, DenIn=S, DenOut=S;
        if (in==CM_S) NumIn = CM; 
        else if (in==M_S) NumIn = M;
        else if (in==KM_S || in==KM_H) NumIn = KM;  
        if (out==CM_S) NumOut = CM; 
        else if (out==M_S) NumOut = M;
        else if (out==KM_S || out==KM_H) NumOut = KM;
        if (in==CM_S || in==M_S || in==KM_S) DenIn = S;
        else if (in==KM_H) DenIn = H;
        if (out==CM_S || out==M_S || out==KM_S) DenOut = S;
        else if (out==KM_H) DenOut = H;
        UNITS NUM(NumIn,NumOut), DENOM(DenIn,DenOut);
        return NUM.factor/DENOM.factor;
    }

    std::cout << "Unknown conversion!!" << std::endl;
    
    return -1;
}
Exemplo n.º 11
0
static void
add_bezier_rect(SKRectObject * rect,
		double p1x, double p1y, double p2x, double p2y,
		double p3x, double p3y, double p4x, double p4y)
{
    double discr, denom, p;

    discr = DISCR(p1x, p2x, p3x, p4x);
    if (discr >= 0)
    {
	double p13 = 3 * p1x, p23 = 3 * p2x, p33 = 3 * p3x;
	double c1 = p23 - p1x - p33 + p4x;
	double c2 = p13 - 2 * p23 + p33;
	double c3 = p23 - p13;
	double t;

	denom = DENOM(p1x, p2x, p3x, p4x);
	if (denom)
	{
	    discr = sqrt(discr);
	    p = p1x - 2 * p2x + p3x;

	    t = (p + discr) / denom;
	    if (0 < t && t < 1)
		SKRect_AddX(rect, ((c1 * t + c2) * t  + c3) * t + p1x);
	    t = (p - discr) / denom;
	    if (0 < t && t < 1)
		SKRect_AddX(rect, ((c1 * t + c2) * t  + c3) * t + p1x);
	}
	else
	{
	    denom = p1x - 2 * p2x + p3x;
	    if (denom)
	    {
		t = 0.5 * (p1x - p2x) / denom;
		if (0 < t && t < 1)
		    SKRect_AddX(rect, ((c1 * t + c2) * t  + c3) * t + p1x);
	    }
	}
    }

    discr = DISCR(p1y, p2y, p3y, p4y);
    if (discr >= 0)
    {
	double p13 = 3 * p1y, p23 = 3 * p2y, p33 = 3 * p3y;
	double c1 = p23 - p1y - p33 + p4y;
	double c2 = p13 - 2 * p23 + p33;
	double c3 = p23 - p13;
	double t;

	denom = DENOM(p1y, p2y, p3y, p4y);
	if (denom)
	{
	    discr = sqrt(discr);
	    p = p1y - 2 * p2y + p3y;

	    t = (p + discr) / denom;
	    if (0 < t && t < 1)
		SKRect_AddY(rect, ((c1 * t + c2) * t  + c3) * t + p1y);
	    t = (p - discr) / denom;
	    if (0 < t && t < 1)
		SKRect_AddY(rect, ((c1 * t + c2) * t  + c3) * t + p1y);
	}
	else
	{
	    denom = p1y - 2 * p2y + p3y;
	    if (denom)
	    {
		t = 0.5 * (p1y - p2y) / denom;
		if (0 < t && t < 1)
		    SKRect_AddY(rect, ((c1 * t + c2) * t  + c3) * t + p1y);
	    }
	}
    }
}