Hide keyboard shortcuts

Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

from __future__ import print_function, division 

 

from sympy.combinatorics.perm_groups import PermutationGroup 

from sympy.combinatorics.permutations import Permutation 

from sympy.utilities.iterables import uniq 

from sympy.core.compatibility import range 

 

_af_new = Permutation._af_new 

 

 

def DirectProduct(*groups): 

""" 

Returns the direct product of several groups as a permutation group. 

 

This is implemented much like the __mul__ procedure for taking the direct 

product of two permutation groups, but the idea of shifting the 

generators is realized in the case of an arbitrary number of groups. 

A call to DirectProduct(G1, G2, ..., Gn) is generally expected to be faster 

than a call to G1*G2*...*Gn (and thus the need for this algorithm). 

 

Examples 

======== 

 

>>> from sympy.combinatorics.group_constructs import DirectProduct 

>>> from sympy.combinatorics.named_groups import CyclicGroup 

>>> C = CyclicGroup(4) 

>>> G = DirectProduct(C, C, C) 

>>> G.order() 

64 

 

See Also 

======== 

__mul__ 

 

""" 

degrees = [] 

gens_count = [] 

total_degree = 0 

total_gens = 0 

for group in groups: 

current_deg = group.degree 

current_num_gens = len(group.generators) 

degrees.append(current_deg) 

total_degree += current_deg 

gens_count.append(current_num_gens) 

total_gens += current_num_gens 

array_gens = [] 

for i in range(total_gens): 

array_gens.append(list(range(total_degree))) 

current_gen = 0 

current_deg = 0 

for i in range(len(gens_count)): 

for j in range(current_gen, current_gen + gens_count[i]): 

gen = ((groups[i].generators)[j - current_gen]).array_form 

array_gens[j][current_deg:current_deg + degrees[i]] = \ 

[x + current_deg for x in gen] 

current_gen += gens_count[i] 

current_deg += degrees[i] 

perm_gens = list(uniq([_af_new(list(a)) for a in array_gens])) 

return PermutationGroup(perm_gens, dups=False)