一组2个元素的二进制运算数为2^(2*2)=16
。
该组上的关联二进制运算数仅为8
一组3个元素的二元运算数为3 ^(3 * 3)= 19683
该集合上的关联二进制操作数仅为113。
如何知道一组n个元素上有多少个关联二元运算?
同样为了获得所有这113个操作并写入文件,有必要编写一个程序 如果我将尝试获取所有19683操作,然后检查它的所有19683操作的关联属性“a *(b c)==(a b)* c”,这将有效但这个n = 4个元素需要很长时间! 如何编写一个有效的算法来解决这个任务? 请帮帮我!
答案 0 :(得分:6)
这不仅仅是设计自己的算法,而是数学模型查找器的任务。对于此任务,我特别推荐mace4
,the LADR library的哪一部分。它专门针对像这样的代数问题。输入(让它命名为semigroups.in
)看起来像:
formulas(sos).
(x * y) * z = x * (y * z).
end_of_list.
然后通过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.
如您所见,非常快。
该库包含许多其他工具,例如isofilter
,允许您过滤代数的同构变体等。