这些辫子相等吗?


13

如果您不熟悉辫子理论,建议您先阅读本节。这个问题假设您至少熟悉手头的概念,并假设您熟悉小组理论

让我们定义σ Ñ为其中所述编织物Ñ从顶部越过所述第链(一个索引)的n + 1个链,和σ Ñ -是的逆σ Ñ(即在N + 1个链与第n个链交叉)。

编织物组Ñ然后通过产生1,σ 2,σ 3,。。。,σn -1 >。因此,B n上的每个编织都可以写成σ编织的乘积。1个


确定一组上的两个辫子是否相等并不是一件容易的事。这可能是很明显,σ 1 σ 33 σ 1,但它是不那么明显的是,例如σ 2 σ 1 σ 21 σ 2 σ 12

因此,问题是“如何确定两个辫子是否相同?”。上面的两个示例分别代表了这一点。通常,以下关系称为阿丁关系:

  • σ σ ĴĴ σ ; i-j> 1

  • σ σ i + 1的 σ i + 1的 σ σ i + 1的

我们可以将这两个关系与组公理结合使用,以证明任何相等的辫子都是相等的。因此,如果重复应用这些关系,则两个辫子是相等的,群公理可以证明这一点。

任务

您将编写一个程序或函数来接受两个辫子,并确定它们是否相等。您也可以选择取一个正整数来表示组的顺序。

这是一个问题,因此答案将以字节计分,字节越少越好。

输入输出

您应该将辫子表示为生成器(或任何等效结构,例如矢量)的有序列表。您可以用任何合理的形式表示生成器(例如,整数,正整数的两个元组和布尔值)。

与标准规则相提并论,您应该输出两个不同的值之一,即接受拒绝。

测试用例

[],       []              -> True
[1,-1],   []              -> True
[1,2,1],  [2,1,2]         -> True
[1,3],    [3,1]           -> True
[1,3,2,1],[3,2,1,2]       -> True
[1,4,-4,3,2,1], [3,2,1,2] -> True
[2,2,1],  [2,1,2]         -> False
[1,2,-1], [-1,2,1]        -> False
[1,1,1,2],[1,1,2]         -> False

1:请注意,虽然B n满足组的所有属性,但是对辫子组的运算不是可交换的,因此,该组不是abelian。

2:如果你想验证自己这一点,我建议将σ 1 -双方,如果你在纸上画的两头在外,或将它们与实际模型的字符串应该清楚为什么是这样的情况。


我不熟悉编织理论,因此我以完全胡言乱语(开个玩笑)的
身份接受VTCing

2
请给我们一些测试用例吗?
HyperNeutrino

@HyperNeutrino对不起,忘记添加它们。现在添加。随时提出更多建议。
Ad Hoc Garf Hunter

@WheatWizard测试案例建议:[],[]
Pavel

拟议的测试案例:[1, 4, -4, 3, 2, 1], [3, 2, 1, 2] => TRUE
HyperNeutrino

Answers:


11

190字节的Haskell

i!j|j<0=reverse$map(0-)$i!(-j)|i==j=[i,i+1,-i]|i+1==j=[i]|i+j==0=[j+1]|i+j==1=[-j,-i,j]
_!j=[j]
j%(k:a)|j+k==0=a
j%a=j:a
i&a=foldr(%)[]$foldr((=<<).(!))[i]a
a?n=map(&a)[1..n]
(a#b)n=a?n==b?n

在线尝试!

怎么运行的

F nn个生成器x 1,...,x n上的自由组。一在编织理论第一结果(周华健阿廷,的Theorie DERZöpfe,1925)是我们有一个射同态˚FÑAUT(˚F Ñ其中动作˚F σ σ的由下式定义

˚F σ X )= X X + 1 X -1
˚F σ X + 1)= X
˚F σ X Ĵ)= X ĴĴ ∉{ + 1}。

˚F σ -1由下式给出

˚F σ -1X )= X + 1
˚F σ -1X + 1)= X + 1 -1 X X + 1
˚F σ -1X Ĵ)= X ĴĴ ∉{ + 1}

当然组合物由下式给出˚F AB = ˚F 一个˚F b

到测试是否一个 = bÑ,就足够了测试˚F 一个X )= ˚F bX )的所有 = 1,...,Ñ。在F n中,这是一个简单得多的问题,我们只需要知道如何用x i -1抵消x i

在代码中:

  • i!j单位计算˚F σ X Ĵ)(其中任一ij可以是负的,表示的倒数),
  • foldr(%)[] 减少自由组,
  • i&a计算f ax i),
  • a?n计算[ f ax 1),…,f ax n)],
  • 并且(a#b)n对于相等测试一个 = bÑ

4

Python 2中270个 263 260 250 249 241字节

def g(b,i=0):
 while i<len(b)-1:
  R,s=b[i:i+2]
  if R<0<s:b[i:i+2]=[[],[s,-R,-s,R],[s,R]][min(abs(R+s),2)];i=-1
  i+=1
 return b
def f(a,b):
 b=g(a+[-v for v in b][::-1]);i=0
 while i<len(b)and b[0]>0:b=b[1:]+[b[0]];i+=1   
 return g(b)==[]

在线尝试!

解决辫子同位素问题的“子词可逆”方法的实现:a = b iff ab ^ -1 =身份。

算法取自:编织同位素问题的有效解决方案,Patrick Dehornoy;他描述了可能感兴趣的其他几种算法...

该算法的工作原理是在列表中从左向右前进,先搜索负数,再搜索正数。即,一个子词形式为x i -1 x j,i,j> 0。

它使用以下等效项:

x i -1 x j = x j x i x j -1 x i -1如果i = j + 1或j = i + 1

x i -1 x j =身份(空列表),如果i == j

x i -1 x j = x j x i -1否则。

通过重复应用,我们最终得到一个形式的列表w1 + w2,其中的每个元素w1都是正数,而的每个元素w2都是负数。(这是该功能的作用g)。

然后我们g第二次申请清单w2 + w1; 如果原始列表与标识相同,则结果列表应为空。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.