Bazı kuantum dönüşüm matrislerini uygulamak için Haskell'i kullanıyorum. Bir kare matrisin, ters ve bitişik matrisler oluşturarak ve her ikisini de test ederek üniter olup olmadığını test etmek için tasarlanmış bir işlevim var. sarma iki değer test için kullanılan basit bir işlevi olan işlevi aşağıda gösterilmiştirHaskell Matrix eşitliği başarısız oluyor
, ters döndü. matrisler aşağıda gösterilen alma sırasında Doğru dönen sorunsuz çalışıyor bazı basit bir test matrisleri için
isUnitary :: [[Copmlex Double]] -> Bool
isUnitary lists = let mat = fromLists lists --Create matrix from lists
conjugateTranspose = fmap conjugate $ Data.Matrix.transpose mat --Conjugate Transpose Matrix
inverseMat = debug("ConjugateTranspose: \n" ++ show conjugateTranspose ++ "\n")
wrap $ inverse mat --The inverse matrix
in if (conjugateTranspose) == inverseMat then debug("InverseMat: \n" ++ show inverseMat ++ "\n")
True
else debug("InverseMat: \n" ++ show inverseMat ++ "\n")
False
:
ConjugateTranspose:
( 1.0 :+ (-0.0) 0.0 :+ (-0.0))
( 0.0 :+ (-0.0) (-1.0) :+ (-0.0))
InverseMat:
( 1.0 :+ 0.0 0.0 :+ 0.0)
( 0.0 :+ (-0.0) (-1.0) :+ (-0.0))
Sorunum A. Edison ((kullanarak inşa matrisi dönüşümü için işlev false döndürür olmasıdır 1/sqrt (2): + 0) ve ((-1/sqrt (2)): + 0))
başarısız matrislerin ikinci çift eşitlik testi neden olabilir neConjugateTranspose:
( 0.7071067811865475 :+ (-0.0) 0.7071067811865475 :+ (-0.0))
( 0.7071067811865475 :+ (-0.0) (-0.7071067811865475) :+ (-0.0))
InverseMat:
( 0.7071067811865476 :+ 0.0 0.7071067811865476 :+ 0.0)
( 0.7071067811865476 :+ 0.0 (-0.7071067811865476) :+ (-0.0))
? Koddaki karmaşık sayıları sunmam için daha doğru bir yol var mı?
Bir mantıklı nedeni kayan noktalı aritmetik nedeniyle yığmak hataları bazı sorunlar olabilir ki? o olsaydı Haskell bir yeni gelen meraktan –