{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
-- {-# LANGUAGE DerivingVia #-}
-- Finite Field 6
instance ( Show a
) => Show ( ToWM a
) where --show ( ToWM x ) = show x
class WithModulus a where
( ToFF x
) + ( ToFF y
) = ToFF
$ mod ( x
+ y
) ( fromInteger $ modulus x
) ( ToFF x
) - ( ToFF y
) = ToFF
$ mod ( x
- y
) ( fromInteger $ modulus x
) ( ToFF x
) * ( ToFF y
) = ToFF
$ mod ( x
* y
) ( fromInteger $ modulus x
)
instance ( WithModulus a
, Show a
) => Show ( ToFF a
) where --show ( ToFF x ) = dropWhile ( == ' ' ) $ dropWhile (/=' ' ) $ show x
{-
ひとつの標数につ1個の整数型の型を用意する
用意する型は
( Eq, Num, Integral, Real, Ord, Enum ,Show )
のインスタンスであるとする
以下それをBTP型とする
ToWM BTP型にWithModulusクラスを継承する
その際メンバ関数modurusは引数によらす標数を返す関数として定義しておく
ToFF ( ToWM BTP )型が有限素体の計算を行う型として使える
これには( Eq, Num, Integral, Real, Ord, Enum ,Show )のインスタンスが自動的に付与される
-}
------ 𝔽₅------
instance WithModulus ( ToWM BT65537 ) where
modulus _ = 65537
------ 𝔽₂₅₇------
instance WithModulus ( ToWM BT257 ) where
modulus _ = 257
------ 𝔽₆₅₅₃₇------
instance WithModulus ( ToWM BT5 ) where
modulus _ = 5
main = do
CnstIyBMQU5HVUFHRSBGbGV4aWJsZUluc3RhbmNlcyAjLX0KCnstIyBMQU5HVUFHRSBHZW5lcmFsaXplZE5ld3R5cGVEZXJpdmluZyAjLX0KCi0tIHstIyBMQU5HVUFHRSBEZXJpdmluZ1ZpYSAjLX0KCgotLSBGaW5pdGUgRmllbGQgNgoKbmV3dHlwZSBUb0ZGIGEgPSBUb0ZGIGEgZGVyaXZpbmcgKCBFcSwgSW50ZWdyYWwsIFJlYWwgLCBFbnVtICxPcmQgKQoKbmV3dHlwZSBUb1dNIGEgPSBUb1dNIGEgZGVyaXZpbmcgKCBFcSwgRW51bSwgUmVhbCwgT3JkLCBJbnRlZ3JhbCwgTnVtICkgLS0gKCBFcSwgSW50ZWdyYWwsIFJlYWwgLCBFbnVtICxPcmQgKQoKaW5zdGFuY2UgICggU2hvdyBhICkgPT4gU2hvdyAoIFRvV00gYSApIHdoZXJlCiAgIHNob3cgKCBUb1dNIHggKSA9IGRyb3BXaGlsZSAoID09ICcgJyApICQgZHJvcFdoaWxlICgvPScgJyApICQgc2hvdyB4CiAgICAtLXNob3cgKCBUb1dNIHggKSA9IHNob3cgeAoKY2xhc3MgV2l0aE1vZHVsdXMgYSB3aGVyZQogICAgbW9kdWx1cyA6OiBhIC0+IEludGVnZXIKCmluc3RhbmNlICggV2l0aE1vZHVsdXMgYSwgTnVtIGEsIEludGVncmFsIGEgKSA9PiBOdW0gKCBUb0ZGIGEgKSB3aGVyZQogICAgKCBUb0ZGIHggKSArICggVG9GRiB5ICkgPSBUb0ZGICQgbW9kICggeCArIHkgKSAoIGZyb21JbnRlZ2VyICQgbW9kdWx1cyB4ICkKICAgICggVG9GRiB4ICkgLSAoIFRvRkYgeSApID0gVG9GRiAkIG1vZCAoIHggLSB5ICkgKCBmcm9tSW50ZWdlciAkIG1vZHVsdXMgeCApCiAgICAoIFRvRkYgeCApICogKCBUb0ZGIHkgKSA9IFRvRkYgJCBtb2QgKCB4ICogeSApICggZnJvbUludGVnZXIgJCBtb2R1bHVzIHggKQogICAgc2lnbnVtICggVG9GRiB4ICkgPSBUb0ZGICQgc2lnbnVtIHgKICAgIGFicyAoIFRvRkYgeCApID0gVG9GRiAkIGFicyB4CiAgICBmcm9tSW50ZWdlciA9IFRvRkYgLiBmcm9tSW50ZWdlcgoKaW5zdGFuY2UgICggV2l0aE1vZHVsdXMgYSwgU2hvdyBhICkgPT4gU2hvdyAoIFRvRkYgYSApIHdoZXJlCiAgIC0tc2hvdyAoIFRvRkYgeCApID0gZHJvcFdoaWxlICggPT0gJyAnICkgJCBkcm9wV2hpbGUgKC89JyAnICkgJCBzaG93IHgKICAgc2hvdyAoIFRvRkYgeCApID0gIHNob3cgeAoKCgp7LQrjgbLjgajjgaTjga7mqJnmlbDjgavjgaQx5YCL44Gu5pW05pWw5Z6L44Gu5Z6L44KS55So5oSP44GZ44KLCueUqOaEj+OBmeOCi+Wei+OBrwooIEVxLCBOdW0sIEludGVncmFsLCBSZWFsLCBPcmQsIEVudW0gLFNob3cgKQrjga7jgqTjg7Pjgrnjgr/jg7PjgrnjgafjgYLjgovjgajjgZnjgosK5Lul5LiL44Gd44KM44KSQlRQ5Z6L44Go44GZ44KLClRvV00gQlRQ5Z6L44GrV2l0aE1vZHVsdXPjgq/jg6njgrnjgpLntpnmib/jgZnjgosK44Gd44Gu6Zqb44Oh44Oz44OQ6Zai5pWwbW9kdXJ1c+OBr+W8leaVsOOBq+OCiOOCieOBmeaomeaVsOOCkui/lOOBmemWouaVsOOBqOOBl+OBpuWumue+qeOBl+OBpuOBiuOBjwpUb0ZGICggVG9XTSBCVFAgKeWei+OBjOaciemZkOe0oOS9k+OBruioiOeul+OCkuihjOOBhuWei+OBqOOBl+OBpuS9v+OBiOOCiwrjgZPjgozjgavjga8oIEVxLCBOdW0sIEludGVncmFsLCBSZWFsLCBPcmQsIEVudW0gLFNob3cgKeOBruOCpOODs+OCueOCv+ODs+OCueOBjOiHquWLleeahOOBq+S7mOS4juOBleOCjOOCiwotfQotLS0tLS0g8J2UveKChS0tLS0tLQpuZXd0eXBlIEJUNjU1MzcgPSBCVDY1NTM3IEludGVnZXIgZGVyaXZpbmcgKCBFcSwgTnVtLCBJbnRlZ3JhbCwgUmVhbCwgT3JkLCBFbnVtICxTaG93ICkKCmluc3RhbmNlIFdpdGhNb2R1bHVzICggVG9XTSBCVDY1NTM3ICkgd2hlcmUKICAgIG1vZHVsdXMgXyA9IDY1NTM3CgpuZXd0eXBlIEY2NTUzNyA9IEY2NTUzNyAoIFRvRkYgKCBUb1dNIEJUNjU1MzcgKSApIGRlcml2aW5nICggRXEsIE51bSwgSW50ZWdyYWwsIFJlYWwsIE9yZCwgRW51bSAsU2hvdyApCgotLS0tLS0g8J2UveKCguKCheKChy0tLS0tLQpuZXd0eXBlIEJUMjU3PSBCVDI1NyBJbnQgZGVyaXZpbmcgKCBFcSwgTnVtLCBJbnRlZ3JhbCwgUmVhbCwgT3JkLCBFbnVtICxTaG93ICkKCmluc3RhbmNlIFdpdGhNb2R1bHVzICggVG9XTSBCVDI1NyApIHdoZXJlCiAgICBtb2R1bHVzIF8gPSAyNTcKCm5ld3R5cGUgRjI1NyA9IEYyNTcgKCBUb0ZGICggVG9XTSBCVDI1NykgKSBkZXJpdmluZyAoIEVxLCBOdW0sIEludGVncmFsLCBSZWFsLCBPcmQsIEVudW0gLFNob3cgKQoKLS0tLS0tIPCdlL3igobigoXigoXigoPigoctLS0tLS0KbmV3dHlwZSBCVDU9IEJUNSBJbnRlZ2VyIGRlcml2aW5nICggRXEsIE51bSwgSW50ZWdyYWwsIFJlYWwsIE9yZCwgRW51bSAsU2hvdyApCgppbnN0YW5jZSBXaXRoTW9kdWx1cyAoIFRvV00gQlQ1ICkgd2hlcmUKICAgIG1vZHVsdXMgXyA9IDUKCm5ld3R5cGUgRjUgPSBGNSggVG9GRiAoIFRvV00gQlQ1KSApIGRlcml2aW5nICggRXEsIE51bSwgSW50ZWdyYWwsIFJlYWwsIE9yZCwgRW51bSAsU2hvdyApCgptYWluID0gZG8KICAgIHByaW50ICQgKCBGNSAzICleNAogICAgcHJpbnQgJCAoIEYyNTcgMyApXjI1NgogICAgcHJpbnQgJCBwcm9kdWN0IFsgRjI1NyAxLi5GMjU3IDI1NiBdCiAgICBwcmludCAkIHByb2R1Y3QgWyBGNjU1MzcgMS4uRjY1NTM3IDY1NTM2IF0K