GAP 系统中列表的两倍和计算错误

Error in Computing the Two-Fold Sumset of a List in the GAP System

我正在尝试在 GAP 系统中编写代码,允许我用自身构造一个集合的两倍总和。本质上,这只是一组元素,可以写成给定集合中两个元素的和。明确地,如果 S 是所讨论的集合(或列表),则其两倍和集是集合(或列表)S + S.

在GAP系统中,我设计了以下代码来实现这个构造。我将提供一个测试集用于演示目的,但用户应该能够提供一般的测试集。

A := [8, 11, 15, 16, 17, 19, 20, 22, 23, 24, 25, 
      26, 27, 28, 30, 31, 32, 33, 34, 35, 36, 37];
L := [ ];
for i in A do 
  for j in A do 
    Add(L, i + j); 
  od; 
od;

我希望此代码添加 A 所有可能的元素对,并将它们收集在一个(最初为空)列表 L 中;然而,当我执行代码时,L!

中神秘地缺少元素 22 = 11 + 11

我承认我是一个新手程序员,也许这个构造可以以更有效的方式实现,但这是首先想到的。我将不胜感激关于此事的任何见解或建议。我提前感谢大家的时间和考虑。

  1. 实际上,那里有 22 个:
gap> 22 in L;
true
gap> Position(L,22);
24
  1. 根据目的,您可能希望使用 AddSet 而不是 Add 来消除重复项,或者至少对结果列表进行排序 L
gap> L1 := [ ];;
gap> for i in A do for j in A do AddSet(L1, i + j); od; od;
gap> L1=Set(L); # just to check
true
  1. 同样,根据操作的目的和可交换性(您处理的是整数列表,还是只是一个示例,而您可能正在处理其他类型的对象?),您可能还需要进一步优化,以避免在计算 a+b 之后计算 b+a (你说你想要“设置(或列出)S + S”所以它并不十分清楚)。
gap> L2 := [ ];;
gap> for i in [1..Length(A)] do
>      for j in [i..Length(A)] do
>        AddSet(L2, A[i] + A[j]);
>      od;
>    od;
gap> L2=Set(L);
true