File: README

package info (click to toggle)
libmath-cartesian-product-perl 1.009-1
  • links: PTS, VCS
  • area: main
  • in suites: buster, stretch
  • size: 108 kB
  • ctags: 7
  • sloc: perl: 73; makefile: 9
file content (146 lines) | stat: -rw-r--r-- 4,059 bytes parent folder | download | duplicates (3)
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
Name
    Math::Cartesian::Product - Generate the Cartesian product of zero or
    more lists.

Synopsis
     use Math::Cartesian::Product;

     cartesian {print "@_\n"} [qw(a b c)], [1..2];

     #  a 1
     #  a 2
     #  b 1
     #  b 2
     #  c 1
     #  c 2

     cartesian {print "@_\n"} ([0..1]) x 8;

     #  0 0 0 0 0 0 0 0
     #  0 0 0 0 0 0 0 1
     #  0 0 0 0 0 0 1 0
     #  ...
     #  1 1 1 1 1 1 1 0
     #  1 1 1 1 1 1 1 1

     print "@$_\n" for
       cartesian {"@{[reverse @_]}" eq "@_"}
         ([' ', '*']) x 8;

     #       * *
     #     *     *
     #     * * * *
     #   *         *
     #   *   * *   *
     #   * *     * *
     #   * * * * * *
     # *             *
     # *     * *     *
     # *   *     *   *
     # *   * * * *   *
     # * *         * *
     # * *   * *   * *
     # * * *     * * *
     # * * * * * * * *

Description
    Generate the Cartesian product of zero or more lists.

    Given two lists, say: [a,b] and [1,2,3], the Cartesian product is the
    set of all ordered pairs:

     (a,1), (a,2), (a,3), (b,1), (b,2), (b,3)

    which select their first element from all the possibilities listed in
    the first list, and select their second element from all the
    possibilities in the second list.

    The idea can be generalized to n-tuples selected from n lists where all
    the elements of the first list are combined with all the elements of the
    second list, the results of which are then combined with all the member
    of the third list and so on over all the input lists.

    It should be noted that Cartesian product of one or more lists where one
    or more of the lists are empty (representing the empty set) is the empty
    set and thus has zero members; and that the Cartesian product of zero
    lists is a set with exactly one member, namely the empty set.

    "cartesian()" takes the following parameters:

    1. A block of code to process each n-tuple. this code should return true
    if the current n-tuple should be included in the returned value of the
    "cartesian()" function, otherwise false.

    2. Zero or more lists.

    "cartesian()" returns an array of references to all the n-tuples
    selected by the code block supplied as parameter 1 if called in list
    context, else it returns a count of the selected n-tuples.

    "cartesian()" croaks if you try to form the Cartesian product of
    something other than lists of things or prior Cartesian products.

    The cartesian product of lists A,B,C is associative, that is:

      (A X B) X C = A X (B X C)

    "cartesian()" respects associativity by allowing you to include a
    Cartesian product produced by an earlier call to "cartesian()" in the
    set of lists whose Cartesian product is to be formed, at the cost of a
    performance penalty if this option is chosen.

      use Math::Cartesian::Product;

      my $a = [qw(a b)];
      my $b = [cartesian {1} $a, $a];
      cartesian {print "@_\n"} $b, $b;

      # a a a a
      # a a a b
      # a a b a
      # ...

    "cartesian()" is easy to use and fast. It is written in 100% Pure Perl.

Export
    The "cartesian()" function is exported.

Installation
    Standard Module::Build process for building and installing modules:

      perl Build.PL
      ./Build
      ./Build test
      ./Build install

    Or, if you're on a platform (like DOS or Windows) that doesn't require
    the "./" notation, you can do this:

      perl Build.PL
      Build
      Build test
      Build install

Author
    Philip R Brenan at gmail dot com

    http://www.appaapps.com

Acknowledgements
    With much help and good natured advice from Philipp Rumpf and Justin
    Case to whom I am indebted.

See Also
    Math::Disarrange::List
    Math::Permute::List
    Math::Permute::Lists
    Math::Permute::Partitions
    Math::Subsets::List
    Math::Transform::List

Copyright
    Copyright (c) 2009-2015 Philip R Brenan.

    This module is free software. It may be used, redistributed and/or
    modified under the same terms as Perl itself.