我正在尝试在 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
- 实际上,有 22 个:
gap> 22 in L;
true
gap> Position(L,22);
24
- 根据目的,您可能希望使用
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
- 同样,根据操作的目的和交换性(您是在处理整数列表,还是只是一个示例,而您可能正在处理一些其他类型的对象?),您可能还需要进一步优化,以避免在计算
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