Spracherkennung für: .tst vermutete Sprache: Unknown {[0] [0] [0]} [Methode: Schwerpunktbildung, einfache Gewichte, sechs Dimensionen]
gap> START_TEST("GBNP test26");
gap> ######################### BEGIN COPYRIGHT MESSAGE #########################
gap> # GBNP - computing Gröbner bases of noncommutative polynomials
gap> # Copyright 2001-2010 by Arjeh M. Cohen, Dié A.H. Gijsbers, Jan Willem
gap> # Knopper, Chris Krook. Address: Discrete Algebra and Geometry (DAM) group
gap> # at the Department of Mathematics and Computer Science of Eindhoven
gap> # University of Technology.
gap> #
gap> # For acknowledgements see the manual. The manual can be found in several
gap> # formats in the doc subdirectory of the GBNP distribution. The
gap> # acknowledgements formatted as text can be found in the file chap0.txt.
gap> #
gap> # GBNP is free software; you can redistribute it and/or modify it under
gap> # the terms of the Lesser GNU General Public License as published by the
gap> # Free Software Foundation (FSF); either version 2.1 of the License, or
gap> # (at your option) any later version. For details, see the file 'LGPL' in
gap> # the doc subdirectory of the GBNP distribution or see the FSF's own site:
gap> #
https://www.gnu.org/licenses/lgpl.html
gap> ########################## END COPYRIGHT MESSAGE ##########################
gap>
gap> ### filename = "exampleColagen.g"
gap> ### authors Cohen & Gijsbers
gap>
gap> ### THIS IS A GAP PACKAGE FOR COMPUTING NON-COMMUTATIVE GROBNER BASES
gap>
gap> # <#GAPDoc Label="ExampleColagen">
gap> # <Section Label="ExampleColagen"><Heading>The cola gene puzzle</Heading>
gap> # <P/>
gap> # A prize question appearing in the January 2005 issue of
gap> # the Dutch journal "Natuur en Techniek" asked for a DNA change
gap> # of cows so that they could produce Cola instead of milk.
gap> # A team of genetic manipulators
gap> # has tools to perform the following
gap> # five DNA string operations. (Here the strings before and
gap> # after the equality sign can be interchanged at will.)
gap> # <P/>
gap> # operation 1: TCAT = T;
gap> # <P/>
gap> # operation 2: GAG = AG;
gap> # <P/>
gap> # operation 3: CTC = TC;
gap> # <P/>
gap> # operation 4: AGTA = A;
gap> # <P/>
gap> # operation 5: TAT = CT.
gap> # <P/>
gap> # The first question is to show how they can transform the
gap> # milk gene TAGCTAGCTAGCT to the
gap> # cola gene CTGACTGACT.
gap> # <P/>
gap> # A second question is to show that mad cow disease related
gap> # retro virus CTGCTACTGACT can be avoided at all times.
gap> # Can this be guaranteed?
gap> # <P/>
gap> # We answer these questions using the trace functions of the
gap> # Gröbner basis package GBNP in Section <Ref Sect="tracefun"/>.
gap> # <P/>
gap> # First load the package and set the standard infolevel <Ref
gap> # InfoClass="InfoGBNP" Style="Text"/> to 0 and the time infolevel <Ref
gap> # Func="InfoGBNPTime" Style="Text"/> to 0 to minimize the printing of
gap> # data regarding the computation (for more information about the info
gap> # level, see Chapter <Ref Chap="Info"/>).
gap>
gap> # <L>
gap> LoadPackage("gbnp", false);
true
gap> SetInfoLevel(InfoGBNP,0);
gap> SetInfoLevel(InfoGBNPTime,0);
gap> # </L>
gap>
gap>
gap> # We introduce the free algebra <C>ALG</C>
gap> # on the generators corresponding to the four letters in the DNA code
gap> # and express the milk gene and cola gene as monomials in this algebra.
gap>
gap> # <L>
gap> ALG:=FreeAssociativeAlgebraWithOne(Rationals, "A", "C", "G", "T");;
gap> g:=GeneratorsOfAlgebra(ALG);;
gap> A:=g[2];;
gap> C:=g[3];;
gap> G:=g[4];;
gap> T:=g[5];;
gap>
gap> milk := T*A*G*C*T*A*G*C*T*A*G*C*T;;
gap> cola := C*T*G*A*C*T*G*A*C*T;;
gap> # </L>
gap>
gap>
gap> # We next enter the set <M>K</M> of binomials <M>x-y</M>
gap> # corresponding to the five operations <M>x = y</M> listed above.
gap> # We enter the binomials as members of <C>ALG</C> and
gap> # let <C>KNP</C> be the corresponding set of NP polynomials.
gap>
gap> # <L>
gap> rule1 := T*C*A*T - T;;
gap> rule2 := G*A*G - A*G;;
gap> rule3 := C*T*C - T*C;;
gap> rule4 := A*G*T*A - A;;
gap> rule5 := T*A*T - C*T;;
gap> K := [rule1,rule2,rule3,rule4,rule5];;
gap> KNP := List(K,x-> GP2NP(x));;
gap> # </L>
gap>
gap> # We stipulate how the variables will be printed and print <C>KNP</C>.
gap> # See <Ref Func="PrintNPList" Style="Text"/>.
gap>
gap> # <L>
gap> GBNP.ConfigPrint("A","C","G","T");
gap> PrintNPList(KNP);
TCAT - T
GAG - AG
CTC - TC
AGTA - A
TAT - CT
gap> # </L>
gap>
gap>
gap> # Now calculate the usual Gröbner basis with <Ref Func="SGrobner"
gap> # Style="Text"/>.
gap>
gap> # <L>
gap> GB := SGrobner(KNP);;
gap> # </L>
gap>
gap>
gap> # Compare milk and cola after taking their strong normal forms
gap> # with respect to <C>GB</C>
gap> # using
gap> # <Ref Func="StrongNormalFormNP" Style="Text"/>.
gap> # We observe that they have the same normal form and so there is
gap> # a way to transform the milk gene into the cola gene.
gap>
gap> # <L>
gap> milkNP := GP2NP(milk);;
gap> colaNP := GP2NP(cola);;
gap> milkRed := NP2GP(StrongNormalFormNP(milkNP,GB),ALG);
(1)*T
gap> colaRed := NP2GP(StrongNormalFormNP(colaNP,GB),ALG);
(1)*T
gap> # </L>
gap>
gap> # But this information does not yet show us how to perform the transformation.
gap> # To this end we calculate the Gröbner basis with trace information,
gap> # using the function
gap> # <Ref Func="SGrobnerTrace" Style="Text"/>.
gap>
gap> # <L>
gap> GTrace := SGrobnerTrace(KNP);;
gap> # </L>
gap>
gap> # The full trace can be printed with <Ref Func="PrintTraceList" Style="Text"/>,
gap> # but we only print the relations (and no trace) by invoking <Ref
gap> # Func="PrintNPListTrace" Style="Text"/>.
gap>
gap> # <L>
gap> PrintNPListTrace(GTrace);
CT - T
GA - A
AGT - AT
ATA - A
TAT - T
TCA - TA
gap> # </L>
gap>
gap>
gap> # In order to display a proof that <M>milk-cola</M>
gap> # belongs to the ideal
gap> # we use <Ref Func="StrongNormalFormTraceDiff" Style="Text"/>,
gap> # The result is a record, <C>p</C> say, containing
gap> # <C>milk-cola</C> in the field <C>p.pol</C>
gap> # (the normal form will be subtracted from the argument <C>milk-cola</C>
gap> # to obtain <C>p.pol</C>, but the normal form is zero
gap> # because the argument belongs to the ideal generated by <C>K</C>).
gap> # The other field of the record <C>p</C> is
gap> # <C>p.trace</C>, the traced polynomial, which is best displayed
gap> # by use of <Ref Func="PrintTracePol" Style="Text"/>.
gap>
gap> # <L>
gap> p := StrongNormalFormTraceDiff(CleanNP(GP2NP(milk-cola)),GTrace);;
gap> NP2GP(p.pol,ALG);
(1)*(T*A*G*C)^3*T+(-1)*(C*T*G*A)^2*C*T
gap> PrintTracePol(p);
- TGATGAG(1) + TAGG(1)ATAT - TATATAGG(1) - TGAG(1)GACT + TGATGACG(1) - G(
1)GACTGACT - TAGCG(1)ATAT - TATAGG(1)AGT + TATATAGCG(1) + TGACG(1)GACT + CG(
1)GACTGACT - TAGG(1)AGTAGT + TAGTAGTAGG(1) + TATAGCG(1)AGT + TAGCG(
1)AGTAGT + TAGTAGG(1)AGCT - TAGTAGTAGCG(1) + TAGG(1)AGCTAGCT - TAGTAGCG(
1)AGCT - TAGCG(1)AGCTAGCT - TATG(2)TAT - TG(2)TATGAT - TGATGAG(3)AT + TAGG(
3)ATATAT - TATATAGG(3)AT - TGAG(3)ATGACT - G(3)ATGACTGACT - TATAGG(
3)ATAGT - TAGG(3)ATAGTAGT + TAGTAGTAGG(3)AT + TAGTAGG(3)ATAGCT + TAGG(
3)ATAGCTAGCT - TATG(4)T + TG(4)TAT + TATGG(4)T - TG(4)TGAT + TATATG(4)T + TGG(
4)TGAT - TG(4)TATAT + TATG(4)TAGT + TG(4)TAGTAGT + TAGG(5)ATAT - TATATAGG(
5) - TATAGG(5)AGT - TAGG(5)AGTAGT
gap> # </L>
gap>
gap> # In order to give a precise answer to the first question
gap> # we need to work a little on <C>p.trace</C>. To do so, we
gap> # introduce the following function, which creates the NP polynomial
gap> # corresponding
gap> # to the <C>i</C>-th term in the expression <C>p.trace</C>
gap> # of <C>p.pol</C> as a linear combination of members of <C>KNP</C>.
gap> # It is used to obtain the list <C>EvalList</C> of polynomials
gap> # for all <C>i</C>.
gap>
gap> # <L>
gap> EvalTracePol := function(i,p,KNP)
> local x,pi;
> pi := p.trace[i];
> x := BimulNP(pi[1],KNP[pi[2]],pi[3]);
> return [x[1],pi[4]*x[2]];
> end;;
gap>
gap> lev := Length(p.trace);;
gap> EvalList := List([1..lev], y -> CleanNP(EvalTracePol(y,p,KNP)));;
gap> # </L>
gap>
gap> # In order to find the rewrite from the milk gene to the cola gene
gap> # as required for an answer to the first question,
gap> # we match leading terms recursively.
gap>
gap> # <L>
gap> UnusedIndices := Set([1..lev]);;
gap> RunningTerm := milkNP[1][1];;
gap> stepno := 0;;
gap> NP2GP(milkNP,ALG);
(1)*(T*A*G*C)^3*T
gap> while Length(UnusedIndices) > 0 do
> i := 0;
> notfnd := true;
> while i < lev and notfnd do
> i := i+1;
> if EvalList[i][1][1] = RunningTerm and i in UnusedIndices then
> notfnd := false;
> RemoveSet(UnusedIndices, i);
> RunningTerm := EvalList[i][1][2];
> stepno := stepno+1;
> elif EvalList[i][1][2] = RunningTerm and i in UnusedIndices then
> notfnd := false;
> RemoveSet(UnusedIndices, i);
> RunningTerm := EvalList[i][1][1];
> stepno := stepno+1;
> fi;
> od;
> if i = lev and notfnd = true then Print("error not fnd in"); fi;
> Print(" -(",stepno,")- ");
> PrintNP([[p.trace[i][1]],[1]]);
> Print(" K[",p.trace[i][2],"]\n ");
> PrintNP([[p.trace[i][3]],[1]]);
> Print(" --> ");
> PrintNP([[EvalList[i][1][2]],[1]]);
> od;;
-(1)- TAGC
K[1]
AGCTAGCT
--> TAGCTAGCTAGCT
-(2)- TAG
K[3]
ATAGCTAGCT
--> TAGTCATAGCTAGCT
-(3)- TAG
K[1]
AGCTAGCT
--> TAGTAGCTAGCT
-(4)- TAGTAGC
K[1]
AGCT
--> TAGTAGCTAGCT
-(5)- TAGTAG
K[3]
ATAGCT
--> TAGTAGTCATAGCT
-(6)- TAGTAG
K[1]
AGCT
--> TAGTAGTAGCT
-(7)- TAGTAGTAGC
K[1]
1
--> TAGTAGTAGCT
-(8)- TAGTAGTAG
K[3]
AT
--> TAGTAGTAGTCAT
-(9)- TAGTAGTAG
K[1]
1
--> TAGTAGTAGT
-(10)- TAG
K[1]
AGTAGT
--> TAGTAGTAGT
-(11)- TAG
K[3]
ATAGTAGT
--> TAGTCATAGTAGT
-(12)- TAGC
K[1]
AGTAGT
--> TAGCTAGTAGT
-(13)- TAG
K[5]
AGTAGT
--> TAGCTAGTAGT
-(14)- T
K[4]
TAGTAGT
--> TATAGTAGT
-(15)- TATAG
K[1]
AGT
--> TATAGTAGT
-(16)- TATAG
K[3]
ATAGT
--> TATAGTCATAGT
-(17)- TATAGC
K[1]
AGT
--> TATAGCTAGT
-(18)- TATAG
K[5]
AGT
--> TATAGCTAGT
-(19)- TAT
K[4]
TAGT
--> TATATAGT
-(20)- TATATAG
K[1]
1
--> TATATAGT
-(21)- TATATAG
K[3]
AT
--> TATATAGTCAT
-(22)- TATATAGC
K[1]
1
--> TATATAGCT
-(23)- TATATAG
K[5]
1
--> TATATAGCT
-(24)- TATAT
K[4]
T
--> TATATAT
-(25)- T
K[4]
TATAT
--> TATATAT
-(26)- TAG
K[5]
ATAT
--> TAGCTATAT
-(27)- TAGC
K[1]
ATAT
--> TAGCTATAT
-(28)- TAG
K[3]
ATATAT
--> TAGTCATATAT
-(29)- TAG
K[1]
ATAT
--> TAGTATAT
-(30)- T
K[4]
TAT
--> TATAT
-(31)- TAT
K[4]
T
--> TATAT
-(32)- TAT
K[2]
TAT
--> TATAGTAT
-(33)- TATG
K[4]
T
--> TATGAT
-(34)- T
K[4]
TGAT
--> TATGAT
-(35)- T
K[2]
TATGAT
--> TAGTATGAT
-(36)- TG
K[4]
TGAT
--> TGATGAT
-(37)- TGATGA
K[1]
1
--> TGATGAT
-(38)- TGATGA
K[3]
AT
--> TGATGATCAT
-(39)- TGATGAC
K[1]
1
--> TGATGACT
-(40)- TGA
K[1]
GACT
--> TGATGACT
-(41)- TGA
K[3]
ATGACT
--> TGATCATGACT
-(42)- TGAC
K[1]
GACT
--> TGACTGACT
-(43)- 1
K[1]
GACTGACT
--> TGACTGACT
-(44)- 1
K[3]
ATGACTGACT
--> TCATGACTGACT
-(45)- C
K[1]
GACTGACT
--> CTGACTGACT
gap> NP2GP(colaNP,ALG);
(1)*(C*T*G*A)^2*C*T
gap> # </L>
gap>
gap>
gap> # And now the second question regarding the retro virus.
gap>
gap> # <L>
gap> retro := C*T*G*C*T*A*C*T*G*A*C*T;;
gap> # </L>
gap>
gap>
gap> # We compute the Strong Normal Form
gap> # <Ref Func="StrongNormalFormNP" Style="Text"/>
gap> # of <C>retro</C> with respect to <C>GB</C>.
gap> # As it is <C>TGT</C>, distinct to <C>T</C>, the strong normal form of milk,
gap> # there is no transformation from milk to retro.
gap> # <L>
gap> NP2GP(StrongNormalFormNP(CleanNP(GP2NP(retro)),GB), ALG);
(1)*T*G*T
gap> # </L>
gap>
gap>
gap> # Of course, here too we can verify the reduction,
gap> # by computing <Ref Func="StrongNormalFormTraceDiff" Style="Text"/>
gap> # with input the NP polynomial corresponding to <C>retro</C>
gap> # and with respect to <C>K</C>;
gap> # it is called <C>retroTrace</C>.
gap> # The symbol <C>G</C> in expression like <C>G(2)</C>
gap> # are not to be confused with the single symbols <C>G</C>
gap> # representing the DNA element.
gap>
gap> # <L>
gap> retroTrace := StrongNormalFormTraceDiff(CleanNP(GP2NP(retro)),GTrace);;
gap> PrintTracePol(retroTrace);
TGG(1) - TGC^2G(1) - TGTAG(1) + TGTACG(1) + TGTAGG(1)AT + TGTATGAG(
1) + TGTAG(1)GACT - TGTAGCG(1)AT - TGTATGACG(1) + TGG(1)ACTGACT - TGTACG(
1)GACT + G(1)GCTACTGACT - TGCG(1)ACTGACT - CG(1)GCTACTGACT + TGTATG(
2)TAT + TGG(3)AT + TGCG(3)AT - TGTAG(3)AT + TGTAGG(3)ATAT + TGTATGAG(
3)AT + TGTAG(3)ATGACT + TGG(3)ATACTGACT + G(3)ATGCTACTGACT + TGTG(
4)T + TGTATG(4)T - TGTG(4)TAT - TGTATGG(4)T + TGCG(5) + TGG(5)AT - TGTAG(
5) + TGTAGG(5)AT
gap> # </L>
gap>
gap> # </Section>
gap> # <#/GAPDoc>
gap>
gap> STOP_TEST("test26.g",10000);