[GAP Forum] Pfaffian?
Igor Korepanov
paloff at ya.ru
Wed Aug 31 17:58:12 BST 2011
Dear Forum, dear Mathieu,
Great! It seems to work excellent!
Mathieu: What are my right for using this? Is this code going to be included in some GAP package? Can I include it (also) in my package PL (which is still in its "pre-alpha" stage, but the work will hopefully go faster soon when a graduate student of mine grows a bit more mature :) ), with a proper indication who its author is?
Igor
31.08.2011, 20:02, "Mathieu Dutour" <Mathieu.Dutour at ens.fr>:
> Right now, no as far as I know.
>
> But meanwhile, there is a way to compute polynomially by some
> analog of the row column operations for the determinant.
>
> See below some code:
> # operation Li <--> Lj and Ci <--> Cj if ThePerm=(i,j)
> PermutationRowColumn:=function(TheMat, ThePerm)
> local NewMat, i;
> NewMat:=[];
> for i in [1..Length(TheMat)]
> do
> Add(NewMat, Permuted(TheMat[i], ThePerm));
> od;
> return Permuted(NewMat, ThePerm);
> end;
>
> # operations, Lj <- alpha*Lj and Cj<-alpha*Cj
> RowColumnMultiplication:=function(TheMat, j, alpha)
> local NewMat, i;
> NewMat:=[];
> for i in [1..Length(TheMat)]
> do
> if i<>j then
> Add(NewMat, TheMat[i]);
> else
> Add(NewMat, alpha*TheMat[i]);
> fi;
> od;
> for i in [1..Length(TheMat)]
> do
> NewMat[i][j]:=alpha*NewMat[i][j];
> od;
> return NewMat;
> end;
>
> # operations, Li<- Li+alpha Lj
> # operations, Ci<- Ci+alpha Ci
> AdditionRowColumn:=function(TheMat, i, j, alpha)
> local NewMat, k;
> NewMat:=[];
> for k in [1..Length(TheMat)]
> do
> if k=i then
> Add(NewMat, TheMat[i]+alpha*TheMat[j]);
> else
> Add(NewMat, TheMat[k]);
> fi;
> od;
> for k in [1..Length(NewMat)]
> do
> NewMat[k][i]:=NewMat[k][i]+alpha*NewMat[k][j];
> od;
> return NewMat;
> end;
>
> Pfaffian:=function(MatInput)
> local i, m, p, piv, zero, pfaff, j, k, sgn, row, row2, mult, mult2, result, AntiSymMat;
> AntiSymMat:=StructuralCopy(MatInput);
> m:=Length(AntiSymMat);
> if m mod 2=1 then
> return 0;
> fi;
> p:=m/2;
> zero:=Zero(AntiSymMat[1][1]);
> pfaff:=1;
> sgn:=1;
> for k in [1..p]
> do
> j:=2*k;
> while j<=m and AntiSymMat[2*k-1][j]=zero
> do
> j:=j+1;
> od;
> if j>m then
> return zero;
> fi;
> if j<> 2*k then
> AntiSymMat:=PermutationRowColumn(AntiSymMat, (j,2*k));
> sgn:=-sgn;
> fi;
> row:=AntiSymMat[2*k];
> piv:=row[2*k-1];
> for j in [2*k+1..m]
> do
> row2:=AntiSymMat[j];
> mult:=-row2[2*k-1];
> #
> AntiSymMat:=RowColumnMultiplication(AntiSymMat, j, piv);
> #
> AntiSymMat:=AdditionRowColumn(AntiSymMat, j, 2*k, mult);
> #
> row2:=AntiSymMat[j];
> mult2:=row2[2*k]/piv;
> AntiSymMat:=AdditionRowColumn(AntiSymMat, j, 2*k-1, mult2);
> #
> AntiSymMat:=RowColumnMultiplication(AntiSymMat, j, Inverse(pfaff));
> od;
> pfaff:=-piv;
> od;
> result:=pfaff;
> for k in [1..p-1]
> do
> result:=result/AntiSymMat[2*k-1][2*k];
> od;
> return sgn*result;
> end;
>
> On Wed, Aug 31, 2011 at 06:24:12PM +0400, Igor Korepanov wrote:
>
>> Dear Forum,
>>
>> does GAP calculate a Pfaffian? And with the right sign? And for a big antisymmetric matrix with indeterminates?
>>
>> I will be grateful for any advice.
>>
>> Currently, I found the letter
>> http://mail.gap-system.org/pipermail/forum/2006/001324.html
>> from Mathieu Dutour Sikiric whom I am sending a personal copy of this letter.
>>
>> Igor
More information about the Forum
mailing list