如何通过有效算法在有限集上获得所有代数关联运算?

Ire*_*311 11 c algorithm modeling abstract-algebra semigroup

一组2个元素的二进制运算数是2^(2*2)=16. 在此输入图像描述
该集合上的关联二进制操作数仅为8.
在此输入图像描述
一组3个元素的二进制运算数为3 ^(3*3)= 19683.
该集合上的关联二进制操作数仅为113.如何知道一组n个元素上有多少个关联二元运算?

另外,为了获得所有这113个操作并写入文件,有必要编写程序.
如果我将尝试获取所有19683操作,然后检查它的所有19683操作的关联属性"a*(b c)==(a b)*c",这将起作用但是这需要很长时间才能完成= 4个元素!
如何编写一个有效的算法来解决这个任务?
请帮我!

Pet*_*lák 6

这不仅仅是设计自己的算法,而是数学模型查找器的任务.对于这项任务,我特别推荐LADR库的mace4哪一部分.它专门针对像这样的代数问题.输入(让我们命名)看起来像:semigroups.in

formulas(sos).
  (x * y) * z = x * (y * z).
end_of_list.
Run Code Online (Sandbox Code Playgroud)

然后运行它mace4 -n 4 -N 4 -m 10000 <semigroup.in(找到所有4元素模型并打印最多10000个)产生类似的长输出

...

============================== MODEL =================================

interpretation( 4, [number=2331, seconds=0], [

        function(*(_,_), [
                           1, 2, 3, 3,
                           2, 3, 3, 3,
                           3, 3, 3, 3,
                           3, 3, 3, 3 ])
]).

============================== end of model ==========================

============================== STATISTICS ============================

For domain size 4.

Current CPU time: 0.00 seconds (total CPU time: 0.11 seconds).
Ground clauses: seen=64, kept=64.
Selections=2132, assignments=8520, propagations=6194, current_models=2331.
Rewrite_terms=210696, rewrite_bools=65151, indexes=11452.
Rules_from_neg_clauses=586, cross_offs=3767.

============================== end of statistics =====================

User_CPU=0.11, System_CPU=0.26, Wall_clock=0.

Exiting with 2331 models.
Run Code Online (Sandbox Code Playgroud)

如你所见,它非常快.

该库包含许多其他工具,例如isofilter允许您过滤代数的同构变体等.