/* * Depending on the structure used to reduce the linearized BDHCP, this * function transforms a solution of the (reduced) linearized BDHCP * to a solution matrix for the corresponding matrix equations. */ Define SolutionMatrix(N,C,Method,Structure,Deg) M := N*(N-1)/2; SizeOfM := M - (N-Floor(N/2))*(N-Floor(N/2)-1)/2; SizeOfI := (N-Floor(N/2))*(N-Floor(N/2)-1)/2; If Structure <> "None" Then If Method = "CRTInterpol" Then // C := 1/(t^Deg * 2^(2^(N-Div(N,4))))*C; ???? war mal ein versuch etwas anders zu machen EndIf; EndIf; SolMat := []; If Structure = "None" Then For I := 1 To M Do Append(SolMat,[Submat(C,[1],((I-1)*M+1)..(I*M))]); EndFor; SolMat := BlockMatrix(SolMat); InvSolMat := LUInvert(SolMat,False); If Type(InvSolMat) = STRING Then Return InvSolMat; EndIf; Else UpperRightZero := NewList(SizeOfI,0); UpperRightZero := Mat(NewList(SizeOfM,UpperRightZero)); LowerLeftZero := Transposed(UpperRightZero); IdentMat := Identity(SizeOfI); If Structure = "basic" Then For I := 1 To SizeOfM Do Append(SolMat,[Submat(C,[1],((I-1)*SizeOfM+1)..(I*SizeOfM))]); EndFor; SolMat := BlockMatrix(SolMat); InvSolMat := LUInvert(SolMat,False); If Type(InvSolMat) = STRING Then Return InvSolMat; EndIf; Elif Structure = "SolStructure" Then // SubMats Row2Col1 := Transposed(Mat([NewList(Floor((N+1)/2),0)])); Row2Col2 := []; For I := 1 To Floor((N+1)/2) Do Temp := NewList(Floor((N+1)/2),2^(Floor((N+1)/2)-I)); Temp[I] := 0; Append(Row2Col2,Temp); EndFor; Row2Col2 := Mat(Row2Col2); Row2Col2Ident := Identity(Floor((N+1)/2)); // SolMat CountRows := 0; For A := 1 To Floor(N/2) Do For B := A+1 To Floor(N/2) Do // Row Type 1 Col Type 1 BlockRow := [Submat(C,[1],(CountRows+1)..(CountRows+(Floor(N/2)*(Floor(N/2)+1)/2)))]; CountRows := CountRows + (Floor(N/2)*(Floor(N/2)+1)/2); Count := 0; // Row Type 1 Col Type 2 For I := Floor(N/2)-1 To 0 Step -1 Do Count := Count + I + 1; BlockRow[1][1][Count] := NewList(Floor((N+1)/2),BlockRow[1][1][Count]); EndFor; // Row Type 1 BlockRow[1][1] := Flatten(BlockRow[1][1]); Append(SolMat,BlockRow); EndFor; If A > 1 Then // Row Type 2 BlockRow := [Submat(C,[1],(CountRows+1)..(CountRows+(Floor(N/2)*(Floor(N/2)+3)/2)))]; CountRows := CountRows + (Floor(N/2)*(Floor(N/2)+3)/2); Count := 0; For I := Floor(N/2)-1 To 0 Step -1 Do Count := Count + 1; For J := Count To Count+I-1 Do Temp := Row2Col1; For K := Floor((N+1)/2) To 1 Step -1 Do Temp[Floor((N+1)/2)-K+1][1] := 2^(K-1)*BlockRow[1][1][J]; EndFor; BlockRow[1][1][J] := Temp; EndFor; Count := Count + I + 1; Temp := BlockRow[1][1][Count-1]*Row2Col2; For I := Floor((N+1)/2) To 1 Step -1 Do Temp[I][I] := SumPowerTwo(Floor((N+1)/2)-I)*BlockRow[1][1][Count-1] + BlockRow[1][1][Count]; EndFor; BlockRow[1][1][Count-1] := Submat(Temp,1..NumRows(Temp),1..(NumCols(Temp)-1)); BlockRow[1][1][Count] := Submat(Temp,1..NumRows(Temp),[NumCols(Temp)]); EndFor; BlockRow[1] := BlockMatrix(BlockRow[1]); Append(SolMat,BlockRow); EndIf; EndFor; // First Row Type 2 Temp := []; For I := 1 To Floor(N/2) Do For J := I+1 To Floor(N/2) Do Append(Temp,Row2Col1); EndFor; Append(Temp,2^(I-1)*Row2Col2Ident); EndFor; Temp := BlockMatrix([Temp]); Count := 2*(Floor(N/2)-1); For I := 1 To Floor(N/2)-1 Do Temp := Temp - 2^I*SolMat[Count][1]; Count := Count + Floor(N/2)-1-I; EndFor; Insert(SolMat,Floor(N/2),[Temp]); SolMat := BlockMatrix(SolMat); InvSolMat := LUInvert(SolMat,False); If Type(InvSolMat) = STRING Then Return InvSolMat; EndIf; Else FirstRow2 := NewList(Floor(N/2)*(Floor(N/2)+1)/2,0); C := C[1]; Count1 := 0; Count2 := Floor(N/2); For I := 1 To Floor(N/2) Do For J := I+1 To Floor(N/2) Do Count1 := Count1 + Floor(N/2)*(Floor(N/2)+1)/2; EndFor; FirstRow2[Count2] := FirstRow2[Count2] + 2^(I-1); Count2 := Count2 + Floor(N/2) - I; If I > 1 Then Count1 := Count1 + 1; Count3 := Floor(N/2); FirstRow2[Count3] := FirstRow2[Count3] - 2^(I-1)*C[Count1]; For K := Floor(N/2)-1 To 1 Step -1 Do Count3 := Count3 + K; Insert(C,Count1,NewList(K,0)); Count1 := Count1 + 2; FirstRow2[Count3] := FirstRow2[Count3] - 2^(I-1)*C[Count1]; EndFor; EndIf; EndFor; Insert(C,(Floor(N/2)-1)*Floor(N/2)*(Floor(N/2)+1)/2+1,FirstRow2); SmallSolMat := MakeMatByRows(Floor(N/2)*(Floor(N/2)+1)/2, Floor(N/2)*(Floor(N/2)+1)/2,Flatten(C)); InvSmallSolMat := LUInvert(SmallSolMat,False); If Type(InvSmallSolMat) = STRING Then Return InvSmallSolMat; EndIf; SolMat := []; InvSolMat := []; Count1 := Floor(N/2)-1; Count2 := 0; For I := 1 To Floor(N/2) Do For J := 1 To Count1 Do Append(SolMat,SmallSolMat[J+Count2]); Append(InvSolMat,InvSmallSolMat[J+Count2]); Count3 := Floor(N/2); For K := 1 To Floor(N/2) Do SolMat[Len(SolMat)][Count3] := NewList(Floor((N+1)/2),SolMat[Len(SolMat)][Count3]); InvSolMat[Len(InvSolMat)][Count3] := NewList(Floor((N+1)/2),InvSolMat[Len(InvSolMat)][Count3]); Count3 := Count3 + Floor(N/2) - K; EndFor; SolMat[Len(SolMat)] := Flatten(SolMat[Len(SolMat)]); InvSolMat[Len(InvSolMat)] := Flatten(InvSolMat[Len(InvSolMat)]); EndFor; Count2 := Count2 + Count1 + 1; Count1 := Count1 - 1; Temp1 := SmallSolMat[Count2]; Temp2 := InvSmallSolMat[Count2]; Count3 := Floor(N/2); For K := 1 To Floor(N/2) Do Temp1[Count3] := NewList(Floor((N+1)/2),0); Temp2[Count3] := NewList(Floor((N+1)/2),0); Temp1[Count3][1] := SmallSolMat[Count2][Count3]; Temp2[Count3][1] := InvSmallSolMat[Count2][Count3]; Count3 := Count3 + Floor(N/2) - K; EndFor; Temp1 := Flatten(Temp1); Temp2 := Flatten(Temp2); Append(SolMat,Temp1); Append(InvSolMat,Temp2); For J := 1 To Floor((N+1)/2)-1 Do Insert(Temp1,1,0); Insert(Temp2,1,0); Remove(Temp1,Len(Temp1)); Remove(Temp2,Len(Temp2)); Append(SolMat,Temp1); Append(InvSolMat,Temp2); EndFor; EndFor; SolMat := Mat(SolMat); InvSolMat := Mat(InvSolMat); EndIf; SolMat := BlockMatrix([[SolMat,UpperRightZero],[LowerLeftZero,IdentMat]]); InvSolMat := BlockMatrix([[InvSolMat,UpperRightZero],[LowerLeftZero,IdentMat]]); EndIf; Return [SolMat,InvSolMat]; EndDefine;