在函数范式的fold函数中,我们传递和累加器值,它通常被初始化为函数所适用的运算符的标识元素。
对于列表中的加法,对于乘法1,它将为0,依此类推。
即+(0, a) = a
和
*(1, a) = a
那么mod运算符 %(identity,a)= a 会是什么?
Mod将来自[0,a)
,因此身份似乎不可能。
我知道计算机不一定遵循模数的数学定义。
此外 是否所有运算符都具有标识元素,或者它依赖于运算符应具有的某些特定属性?
是否有任何通用的方法来查找任何运算符的标识元素?
我的问题是:
答案 0 :(得分:2)
fold 通常在称为monoid [wiki]的代数结构上完成。
monoid是代数结构。它是在 S 的集合上定义的,具有关联函数 f (模数不是关联函数)。此外,应该有一个元素e∈S,称为" * identity"元件。一个元素, f(e,x)= x 和 f(x,e)= x 。
可以证明,对于一个monoid,总有一个标识元素(所以不可能构造一个monoid,其中两个元素是标识元素。证明如下:说有两个元素 a 和 b 是中性元素, a≠b ,然后 f(a,b)= a (上面的定义),但 f(a,b)= b 也成立,因为一个函数只能返回一个元素,而 a≠b ,我们已经达成了矛盾因此,我们可以得出结论 a = b 。
我们无法为模运算(以及自然,整数,...)数字定义一个monoid,因为运算符应该是 associative ,对于这些集合,它不能保持: (a%b)%c = a%(b%c) 。
回答你的问题(一般而言):
模数运算符的标识元素是什么? %(identity,a)= a
如果我们采用自然的,积分的,理性的,真实的等数字,那么modulo就没有一个单位元素。
运营商必须遵循哪些特定属性才能拥有身份?
只是有一个元素e∈S,使 f(x,e)= x 。我们可以"构建"来自每个函数的函数,只需选择一个元素e∈S,然后将其定义为: f'(x,y)= x if y = e 和 f'(x,y)= f(x,y)否则。
如果运营商具有身份,是否有通用的方法来查找运营商的身份。
由于上面的内容表明我们可以为每个函数构造这样的函数,因此,据我所知,没有一般方法可以为运算符的标识元素提供资金。