gap-system - 计算 GAP System 中列表的二重和集时出错

我正在尝试在 GAP System 中编写一个代码,该代码将允许我自己构造一个集合的两倍和集。本质上,这只是可以写成给定集合中两个元素之和的元素集合。明确地说,如果 S 是所讨论的集合(或列表),那么它的二重和集是集合(或列表)S + S。

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

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 中;但是,当我实现代码时,元素 22 = 11 + 11 神秘地出现在 L 中!

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

回答1

  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. 同样,根据操作的目的和交换性(您是在处理整数列表,还是只是一个示例,而您可能正在处理一些其他类型的对象?),您可能还需要进一步优化,以避免在计算 b+a 之后计算 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

相似文章

sass - 用于处理网格布局的 mixin

我创建了一个sass@mixin来处理网格布局。但是我遇到了几个问题:如果只需要行,我想删除grid-template-columns属性,反之亦然。此外,如果只需要row-gap,则column-g...

最新文章