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

Cosa è CoCoA?


This pages counts visits by visitors



Cosa si può calcolare con CoCoA?

  • Interi molto grandi
  • Numeri Razionali
  • Polinomi
  • Sistemi di equazioni lineari
  •  
  • Soluzioni intere non-negative
  • Chi è il mentitore?
  • Coloriamo la carta geografica
  • Formula di Erone

  • Interi molto grandi

    Il più grande "intero macchina" che un computer a 32 bit può calcolare è 2^32-1, ma CoCoA, sfruttando la potente libreria di calcolo a precisione illimitata GMP, può calcolare anche 2^300000: provate!
    2^32-1; 
    4294967295
    2^64-1; 
    18446744073709551615

    Numeri Razionali

    CoCoA è molto preciso con le frazioni: non le approssima mai! Quindi 1/3 è proprio diverso da 0.3333333333333
    (1/3) * 3;
    1
    0.3333333333333 * 3;
    9999999999999/10000000000000

    Polinomi

    CoCoA è specializzato in polinomi: li può moltiplicare, dividere, fattorizzare, ....
    (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]]
    ]

    Sistemi di equazioni lineari

    CoCoA può risolvere sistemi di equazioni lineari. È sufficiente codificare ogni equazione del tipo f = c con il polinomio f - c. Può anche risolvere sistemi di equazioni non lineari, ma questo è un po' più difficile e ne parleremo dopo. Risolviamo ora
    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]
    Quindi la soluzione è (z=21/5, x=-3/5, y=8/5)

    Soluzioni intere non-negative

    È possibile trovare le triple di interi non-negativi soluzioni del seguente sistema?
    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]]
    Quindi ci sono soltanto quattro soluzioni: (0, 10, 6), (6, 11, 4), (12, 12, 2), (18, 13, 0).

    Chi è il mentitore?

    A dice: "B mente."
    B dice: "C mente."
    C dice: "A e B mentono."
    Ora, chi è il mentitore?
    Per rispondere a questa domanda codifichiamo VERO con 1 e FALSO con 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]
    L'unica possibilità è che A e C mentano, mentre B dica la verità

    Coloriamo la carta geografica

    È possibile colorare gli stati di una cartina usando solo tre colori in modo tale che i paesi confinanti non abbiano lo stesso colore?

    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]
    Il risultato si interpreta nel modo seguente: le variabili x[1], x[2],..., x[6] rappresentano gli stati mentre i numeri -1, 0, 1 identificano i colori. CoCoA trova una colorazione possibile: colore 0 per lo stato 2, colore 1 per lo stato 1,..., colore -1 per lo stato 5. Ad esempio, se associamo a 0 il colore blu, a 1 il colore rosso e a -1 il verde, otteniamo


    Formula di Erone

    È possibile esprimere l'area di un triangolo in funzione della lunghezza dei suoi lati?

    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]
    ]
    Il risultato si traduce nella relazione:
    s^2 = -(1/16)(a+b+c)(a+b-c)(a-b+c)(a-b-c).
    Questo significa che il quadrato dell'area di un triangolo di lati a,b,c è p(p-a)(p-b)(p-c) dove p = 1/2(a+b+c) rappresenta il semiperimetro. Questa è la formula di Erone! Quindi l'area di un triangolo si può esprimere in funzione della lunghezza dei suoi lati.

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