Given a list pp
of permutations we can form their product by means of a
for
loop instead of writing down the product explicitly.
gap> pp:= [ (1,3,2,6,8)(4,5,9), (1,6)(2,7,8)(4,9), (1,5,7)(2,3,8,6), > (1,8,9)(2,3,5,6,4), (1,9,8,6,3,4,7,2) ];; gap> prod:= (); () gap> for p in pp do > prod:= prod * p; > od; gap> prod; (1,8,4,2,3,6,5)
First a new variable prod
is initialized to the identity permutation
()
. Then the loop variable p
takes as its value one permutation
after the other from the list pp
and is multiplied with the present
value of prod
resulting in a new value which is then assigned to
prod
.
The for
loop has the following syntax.
for var in list do statements od;
The effect of the for
loop is to execute the statements for every
element of the list. A for
loop is a statement and therefore
terminated by a semicolon. The list of statements is enclosed by the
keywords do
and od
(reverse do
). A for
loop returns no value.
Therefore we had to ask explicitly for the value of prod
in the
preceding example.
The for
loop can loop over any kind of list, even a list with holes.
In many programming languages (and in former versions of GAP, too)
the for
loop has the form
for var from first to last do statements od;
But this is merely a special case of the general for
loop as defined
above where the list in the loop body is a range.
for var in [first..last] do statements od;
You can for instance loop over a range to compute the factorial 15! of the number 15 in the following way.
gap> ff:= 1; 1 gap> for i in [1..15] do > ff:= ff * i; > od; gap> ff; 1307674368000
The following example introduces the while
loop which has the following
syntax.
while condition do statements od;
The while
loop loops over the statements as long as the condition
evaluates to true
. Like the for
loop the while
loop is terminated
by the keyword od
followed by a semicolon.
We can use our list primes
to perform a very simple factorization. We
begin by initializing a list factors
to the empty list. In this list
we want to collect the prime factors of the number 1333. Remember that a
list has to exist before any values can be assigned to positions of the
list. Then we will loop over the list primes
and test for each prime
whether it divides the number. If it does we will divide the number by
that prime, add it to the list factors
and continue.
gap> n:= 1333; 1333 gap> factors:= []; [ ] gap> for p in primes do > while n mod p = 0 do > n:= n/p; > Add(factors, p); > od; > od; gap> factors; [ 31, 43 ] gap> n; 1
As n
now has the value 1 all prime factors of 1333 have been found and
factors
contains a complete factorization of 1333. This can of course
be verified by multiplying 31 and 43.
This loop may be applied to arbitrary numbers in order to find prime
factors. But as primes
is not a complete list of all primes this loop
may fail to find all prime factors of a number greater than 2000, say.
You can try to improve it in such a way that new primes are added to the
list primes
if needed.
You have already seen that list objects may be changed. This holds of
course also for the list in a loop body. In most cases you have to be
careful not to change this list, but there are situations where this is
quite useful. The following example shows a quick way to determine the
primes smaller than 1000 by a sieve method. Here we will make use of the
function Unbind
to delete entries from a list.
gap> primes:= []; [ ] gap> numbers:= [2..1000]; [ 2 .. 1000 ] gap> for p in numbers do > Add(primes, p); > for n in numbers do > if n mod p = 0 then > Unbind(numbers[n-1]); > fi; > od; > od;
The inner loop removes all entries from numbers
that are divisible by
the last detected prime p
. This is done by the function Unbind
which
deletes the binding of the list position numbers[n-1]
to the value n
so that afterwards numbers[n-1]
no longer has an assigned value. The
next element encountered in numbers
by the outer loop necessarily is
the next prime.
In a similar way it is possible to enlarge the list which is looped over. This yields a nice and short orbit algorithm for the action of a group, for example.
In this section you have learned how to loop over a list by the for
loop and how to loop with respect to a logical condition with the while
loop. You have seen that even the list in the loop body can be changed.
The for
loop is described in For. The while
loop is described in
While.
GAP 3.4.4