[CoCoA logo]
Home Page
CoCoA System
Computations in Commutative Algebra

Wat is CoCoA?


This pages counts visits by visitors



Wat kunt U met CoCoA berekenen?

  • Hele grote gehele getallen
  • Rationale getallen
  • Veeltermen
  • Stelsels van lineaire vergelijkingen
  •  
  • Niet-negatieve gehele oplossingen
  • Een voorbeeld uit de logica
  • Kleuren van landkaarten
  • De Formule van Heron

  • Hele grote gehele getallen

    Het grootste gehele "Computer-Getal" op een 32-Bit-Computer is 2^32-1. Maar CoCoA kan - dank zij de machtige GMP-bibliotheek - zelfs getallen zoals 2^300000 berekenen: probeer het!
    2^32-1; 
    4294967295
    2^64-1; 
    18446744073709551615

    Rationale getallen

    CoCoA rekent heel precies met breuken - het gebruikt nooit benaderingen! Dus 1/3 verschilt volledig van 0.3333333333333
    (1/3) * 3;
    1
    0.3333333333333 * 3;
    9999999999999/10000000000000

    Veeltermen

    CoCoA is gespecialiseerd in berekeningen met veeltermen: Het kan vermenigvuldigen, delen en ontbinden, ...
    (x-y)^2 * (x^4-4*z^4) / (x^2+2*z^2);
    x^4 -2*x^3*y +x^2*y^2 -2*x^2*z^2 +4*x*y*z^2 -2*y^2*z^2
    Factor(x^4 -2*x^3*y +x^2*y^2 -2*x^2*z^2 +4*x*y*z^2 -2*y^2*z^2);
    record[
      RemainingFactor := 1,
      factors := [x^2 -2*z^2,  x -y],
      multiplicities := [1,  2]]
    ]

    Stelsels van lineaire vergelijkingen

    CoCoA kan stelsels van lineaire vergelijkingen oplossen. Daavoor moet U een vergelijking f = c omzetten in een veelterm f -c. CoCoA kan ook stelsels van vergelijkingen met veeltermen van hogere graad oplossen. Maar dat is ingewikkelder en we gaan dat later bekijken. Nu zullen we het volgende stelsel van lineaire vergelijkingen oplossen:
    x-y+z=2
    3x-z=-6
    x+y=1
    System := ideal(x-y+z-2, 3*x-z+6, x+y-1);
    ReducedGBasis(System);
    [x +3/5,  y -8/5,  z -21/5]
    Dus de oplossing is (z=21/5, x=-3/5, y=8/5)

    Niet-negatieve gehele oplossingen

    Kunt U de drietallen van niet-negatieve gehele oplossingen vinden van het volgende systeem?
    3x - 4y + 7z=2
    2x - 2y + 5z=10
    M := mat([[3, -4, 7, -2], [2, -2, 5, -10]]);
    H := HilbertBasisKer(M);
    L := [h In H | h[4] <= 1];
    L;
    [[0, 10, 6, 1], [6, 11, 4, 1], [12, 12, 2, 1], [18, 13, 0, 1]]
    De interpretatie is dat er precies vier oplossingen zijn: (0, 10, 6), (6, 11, 4), (12, 12, 2), (18, 13, 0).

    Een voorbeeld uit de logica

    A zegt: "B liegt."
    B zegt: "C liegt."
    C zegt: "A en B liegen."
    Nu is de vraag: wie liegt hier?
    Om deze vraag te beantwoorden coderen we WAAR met 1 en ONWAAR met 0 in ZZ/(2):
    use ZZ/(2)[a,b,c];
    I1 := ideal(a, b-1);
    I2 := ideal(a-1, b);
    A := intersect(I1, I2);
    I3 := ideal(b, c-1);
    I4 := ideal(b-1, c);
    B := intersect(I3, I4);
    I5 := ideal(a, b, c-1);
    I6 := ideal(b-1, a, c);
    I7 := ideal(b, a-1, c);
    I8 := ideal(b-1, a-1, c);
    C := IntersectList([I5, I6, I7, I8]);
    ReducedGBasis(A + B + C);
    [b +1,  a,  c]
    De enige oplossing is dat A en C logen en dat B de waarheid sprak.

    Kleuren van landkaarten

    Kunnen de landen van de kaart gekleurd worden met drie kleuren zodanig dat geen twee aanliggende landen dezelfde kleur hebben?

    use P ::= ZZ/(3)[x[1..6]];
    define F(X)  return X*(X-1)*(X+1);  enddefine;
    VerticesEq := [ F(x[i]) | i in 1..6 ];
    edges := [[1,2],[1,3],  [2,3],[2,4],[2,5],  [3,4],[3,6],
              [4,5],[4,6],  [5,6]];
    EdgesEq := [ (F(x[edge[1]])-F(x[edge[2]]))/(x[edge[1]]-x[edge[2]])
                      |  edge in edges ];
    I := ideal(VerticesEq) + ideal(EdgesEq) + ideal(x[1]-1, x[2]);
    ReducedGBasis(I);
    [x[2],  x[1] -1,  x[3] +1,  x[4] -1,  x[6],  x[5] +1]
    De interpretatie is dat er inderdaad een kleuring is. In dit geval bijvoorbeeld als 0 staat voor blauw, 1 staat voor rood en -1 staat voor groen, dan krijgen we [land 1 = rood; land 2 = blauw; land 3 = groen; land 4 = rood; land 5 = groen; land 6 = blauw]


    De Formule van Heron

    Kan men de oppervlakte van een driehoek uitdrukken als functie van de lengte van de zijden?

    use QQ[x[1..2],y,a,b,c,s];
    A := [x[1], 0];
    B := [x[2], 0];
    C := [ 0,   y];
    Hp := ideal(a^2 - (x[2]^2+y^2),  b^2 - (x[1]^2+y^2),
                c   - (x[2]-x[1]),   2*s - c*y);
    E := elim(x[1]..y, Hp);
    f := monic(gens(E)[1]);
    f;
    a^4 -2*a^2*b^2 +b^4 -2*a^2*c^2 -2*b^2*c^2 +c^4 +16*s^2
    factor(f - 16*s^2);
    record[
      RemainingFactor := 1,
      factors := [a +b -c,  a -b +c,  a +b +c,  a -b -c],
      multiplicities := [1,  1,  1,  1]
    ]
    De interpretatie is dat we hebben
    s^2 = -(1/16)(a+b+c)(a+b-c)(a-b+c)(a-b-c).
    Dit betekent dat het kwadraat van de oppervlakte van een driehoek met zijden a,b,c gelijk is aan p(p-a)(p-b)(p-c) waarbij p = 1/2(a+b+c) is de halve omtrek van de driehoek. Dus het antwoord is JA.

    Written by Stef Tijs
    Please send comments or suggestions to cocoa(at)dima.unige.it
    Last Update: 20 November 2018