1 | initial version |

For the test I wrote such code in GAP

```
GenerateSubgroupListByListOfSubgroupsAndNumber := function (subgroups, number)
local number_subgroups, subgroups_list, factor, i;
number_subgroups := Size(subgroups);
subgroups_list := [];
for i in Reversed([0..number_subgroups-1]) do
factor := Int(number / 2^i);
number := RemInt(number, 2^i);
if factor = 1 then
Add(subgroups_list, subgroups[i+1], 1);
fi;
od;
return subgroups_list;
end;
```

And SAGE equivalent

```
def generate_subgroup_list_by_list_of_subgroups_and_number(subgroups, number):
number_subgroups = len(subgroups);
subgroups_list = []
for i in reversed(range(0, number_subgroups)):
factor, number = int( number / 2^i ), number % 2^i
if factor == 1:
subgroups_list = [subgroups[i]] + subgroups_list
return subgroups_list
```

I think that code above illustrate good example of working with lists. number and etc.

And I ran following benchmarks:

GAP:

```
array := [1..10];
for n in [1..10000] do
for i in [1..100] do
GenerateSubgroupListByListOfSubgroupsAndNumber(array, i);
od;
od;
```

Result:

```
$ time echo "Read(\"gap_benchmark.g\"); quit;" | gap -b -q -T
real 0m7.651s
user 0m7.520s
sys 0m0.056s
```

SAGE:

```
array = [1..10]
for n in [1..10000]:
for i in [1..100]:
generate_subgroup_list_by_list_of_subgroups_and_number(array, i)
```

Result:

```
$ time sage sage_benchmark.sage
real 0m50.127s
user 0m49.707s
sys 0m0.268s
```

So, **7** seconds of GAP work vs **50** second of SAGE.

I will try to use cython with SAGE and will update this answer.

2 | No.2 Revision |

For the test I wrote such code in GAP

```
GenerateSubgroupListByListOfSubgroupsAndNumber := function (subgroups, number)
local number_subgroups, subgroups_list, factor, i;
number_subgroups := Size(subgroups);
subgroups_list := [];
for i in Reversed([0..number_subgroups-1]) do
factor := Int(number / 2^i);
number := RemInt(number, 2^i);
if factor = 1 then
Add(subgroups_list, subgroups[i+1], 1);
fi;
od;
return subgroups_list;
end;
```

And SAGE equivalent

```
def generate_subgroup_list_by_list_of_subgroups_and_number(subgroups, number):
number_subgroups = len(subgroups);
subgroups_list = []
for i in reversed(range(0, number_subgroups)):
factor, number = int( number / 2^i ), number % 2^i
if factor == 1:
subgroups_list = [subgroups[i]] + subgroups_list
return subgroups_list
```

I think that code above ~~illustrate ~~is a good example of working with ~~lists. number ~~lists, numbers and etc.

And I ran following benchmarks:

GAP:

```
array := [1..10];
for n in [1..10000] do
for i in [1..100] do
GenerateSubgroupListByListOfSubgroupsAndNumber(array, i);
od;
od;
```

Result:

```
$ time echo "Read(\"gap_benchmark.g\"); quit;" | gap -b -q -T
real 0m7.651s
user 0m7.520s
sys 0m0.056s
```

SAGE:

```
array = [1..10]
for n in [1..10000]:
for i in [1..100]:
generate_subgroup_list_by_list_of_subgroups_and_number(array, i)
```

Result:

```
$ time sage sage_benchmark.sage
real 0m50.127s
user 0m49.707s
sys 0m0.268s
```

So, **7** seconds of GAP work vs **50** second of SAGE.

I will try to use cython with SAGE and will update this answer.

Copyright Sage, 2010. Some rights reserved under creative commons license. Content on this site is licensed under a Creative Commons Attribution Share Alike 3.0 license.