Algorithm 用代数数据类型来形成大阶循环群有没有简单的方法?
例如,要在Haskell中创建一个N阶循环组,您可以为大整数定义一个类型,Algorithm 用代数数据类型来形成大阶循环群有没有简单的方法?,algorithm,haskell,functional-programming,Algorithm,Haskell,Functional Programming,例如,要在Haskell中创建一个N阶循环组,您可以为大整数定义一个类型,data BigInt=B0 BigInt | B1 BigInt | B,以及通常的add/mod操作。然后,您可以定义op a b=mod(add a b)n,以获得订单的加法组n。问题是add和mod的实现相对复杂,涉及复杂的状态传递递归和进位等。是否有更直接、更自然的方法仅使用数据类型创建循环组?例如: data T = A T T | B T T | C 是否可以为允许我们定义此类组的数据类型定义相对简单的ad
data BigInt=B0 BigInt | B1 BigInt | B
,以及通常的add
/mod
操作。然后,您可以定义op a b=mod(add a b)n
,以获得订单的加法组n
。问题是add
和mod
的实现相对复杂,涉及复杂的状态传递递归和进位等。是否有更直接、更自然的方法仅使用数据类型创建循环组?例如:
data T = A T T | B T T | C
是否可以为允许我们定义此类组的数据类型定义相对简单的
add::T->T->T
?我一直在尝试一些树旋转方案,但似乎要生成一个周期很长的操作并不容易。您必须这样定义数据类型吗?Haskell已经支持带有Integer
的任意精度整数,因此为您的类型定义newtype BigInt=BigInt Integer
,然后定义适当的Num
,Integral
等实例会简单得多。您可能希望使用智能构造函数mkBigInt::Integer->BigInt
,以确保BigInt
值从范围0]开始。。n-1
。这不是我的意思,我特别想问的是,单独使用数据类型是否可行。Integer在后台使用FFI。BigInt/T是如何表示循环组的元素的?所有循环组都与整数同构-那么这只是表示没有机器整数的整数吗?那么(Nat,Nat)
其中(n,m):=n-m
-或者甚至(Bool,Nat)
。这样的定义不是很有效(但与机器整数相比,任何整数的归纳定义都不是),而是有简单的算术运算。这不太正确。所有(有限)循环群的集合同构于自然:每个群都可以用群中元素的数量来表示。大小为n的任何给定循环组的元素/动作集就是大小为n的集合。