1Math::NumSeq::OEIS(3) User Contributed Perl DocumentationMath::NumSeq::OEIS(3)
2
3
4
6 Math::NumSeq::OEIS -- number sequence by OEIS A-number
7
9 use Math::NumSeq::OEIS;
10 my $seq = Math::NumSeq::OEIS->new (anum => 'A000032');
11 my ($i, $value) = $seq->next;
12
14 This module selects a "NumSeq" by an A-number of Sloane's Online
15 Encyclopedia of Integer Sequences.
16
17 If there's "NumSeq" code implementing the sequence then that's used,
18 otherwise local downloaded OEIS files if available. See
19 Math::NumSeq::OEIS::Catalogue for querying available A-numbers.
20
21 Files
22 Local files should be in a ~/OEIS direectory, ie. an OEIS directory in
23 the user's home directory (see File::HomeDir). Files can be HTML, OEIS
24 internal, b-file, and/or a-file.
25
26 ~/OEIS/A000032.html
27 ~/OEIS/A000032.internal.txt
28 ~/OEIS/A000032.internal.html
29 ~/OEIS/b000032.txt
30 ~/OEIS/a000032.txt
31
32 As downloaded from for example
33
34 http://oeis.org/A000032
35 http://oeis.org/search?q=id:A000032&fmt=text
36 http://oeis.org/A000032/internal
37 http://oeis.org/A000032/b000032.txt
38 http://oeis.org/A000032/a000032.txt
39
40 The "internal" text format is the most reliable for parsing. This is
41 the "text" link in the main sequence pages. The "internal" link is the
42 same wrapped in HTML. It can be used here as .internal.html.
43
44 b-files b000000.txt are long lists of values. a-files a000000.txt
45 similarly and even longer, but sometimes they are auxiliary info
46 instead (and in that case not used). Some sequences don't have these,
47 only the 30 or 40 sample values from the HTML or internal page. Those
48 samples might be enough for fast growing sequences.
49
50 b-file or a-file can be used alone by this module, without the text or
51 HTML parts. In that case there's no "$seq->description()" and it may
52 limit the "$seq->characteristic()" attributes.
53
54 Other Notes
55 Sometimes more than one NumSeq module generates an OEIS sequence. For
56 example A000290 is Squares but also Polygonal k=4. The catalogue is
57 arranged so "Math::NumSeq::OEIS" selects the better, faster, or more
58 specific one.
59
60 Sometimes the OEIS has duplicates, ie. two A-numbers which are the same
61 sequence. Both are catalogued so they both give NumSeq module code,
62 but the "$seq->oeis_anum()" method generally only returns whichever is
63 the "primary" one.
64
65 Presently NumSeq code is catalogued with A-numbers only when it is the
66 same as the OEIS sequence. In particular this means "offset" in the
67 OEIS matching the "i_start" of the NumSeq, so i here corresponds to n
68 there. Sometimes an "i_start" parameter here can alter numbering
69 suitably (and in "PlanePathCoord" etc tie-ins the similar "n_start"),
70 but some NumSeq may be uncatalogued because numbering or perhaps first
71 few values are not the same.
72
74 See "FUNCTIONS" in Math::NumSeq for behaviour common to all sequence
75 classes.
76
77 "$seq = Math::NumSeq::OEIS->new (anum => 'A000000')"
78 Create and return a new sequence object.
79
80 Iterating
81 "($i, $value) = $seq->next()"
82 Return the next index and value in the sequence.
83
84 In the current code when reading from a file, any values bigger
85 than a usual Perl int or float are returned as "Math::BigInt"
86 objects in order to preserve precision. Is that a good idea?
87
88 An a000000.txt or b000000.txt file is read line by line. For Perl
89 5.8 ithreads there's a "CLONE" setup which re-opens the file in a
90 new thread so $seq in each thread has its own position. (See
91 perlthrtut and "Making your module threadsafe" in perlmod.)
92
93 But a process "fork()" will have both parent and child with the
94 same open file so care should be taken that only one of them uses
95 $seq in that case. The same is true of all open file handling
96 across a "fork()".
97
98 Random Access
99 "$value = $seq->ith($i)"
100 Return the $i'th value from $seq, or "undef" if $i is outside the
101 range of available values.
102
103 An a000000.txt or b000000.txt file is read by a binary search to
104 find the target $i. This is reasonably efficient and avoids
105 loading or processing an entire file if just a few values are
106 wanted.
107
108 If $i happens to be the next line or just a short distance ahead of
109 what was last read then no search is necessary. This means that
110 "ith()" called sequentially i=1,2,3,4,etc simply reads successive
111 lines the same as "next()" would do.
112
113 Information
114 "$str = $seq->description()"
115 Return a human-readable description of the sequence. For the
116 downloaded files this is the name part ("%N") which is a short
117 description of the sequence.
118
119 A few sequences may have non-ASCII characters in the description.
120 For Perl 5.8 and up they're decoded to wide-chars. Not sure what
121 to do for earlier Perl, currently they're left as the bytes from
122 the download, which may be utf-8.
123
124 "$value = $seq->values_min()"
125 "$value = $seq->values_max()"
126 Return the minimum or maximum values in the sequence, or "undef" if
127 unknown or infinity.
128
129 For files, "values_min()" is guessed from the first few values if
130 non-negative, and "values_max()" is normally considered to be
131 infinite. For keyword "full" the samples are the entire sequence
132 and gives the range. If a range seems to be limited (eg. sequences
133 of -1,0,1) then min and max are obtained from those.
134
135 (Would like the OEIS data to have range information like this in
136 machine-readable form. It's usually in sequence comments or
137 description for human readers.)
138
139 "$ret = $seq->characteristic($key)"
140 For a file, the following standard characteristics are obtained
141 (per "Information" in Math::NumSeq),
142
143 · "integer" always true.
144
145 · "increasing", "non_decreasing" and "smaller" are determined
146 from the sample values or the first few values from an a-file
147 or b-file. Looking at only the few ensures a big file isn't
148 read in its entirety and is normally enough. The intention
149 would be to look at enough values not to be tricked by
150 decreasing values after the first few, etc.
151
152 · "digits" is from keyword "cons" for decimal constants. Some
153 other digit sequences are recognised by their name part though
154 this may be unreliable.
155
156 · "count" is from a name with "number of". This is probably
157 unreliable.
158
159 All the keywords from the OEIS are provided as booleans under names
160 "OEIS_easy" etc. So for example
161
162 if ($seq->characteristic("OEIS_nice")) {
163 print "nooiice ...\n";
164 }
165
167 Math::NumSeq, Math::NumSeq::OEIS::Catalogue
168
170 <http://user42.tuxfamily.org/math-numseq/index.html>
171
173 Copyright 2011, 2012, 2013, 2014, 2016 Kevin Ryde
174
175 Math-NumSeq is free software; you can redistribute it and/or modify it
176 under the terms of the GNU General Public License as published by the
177 Free Software Foundation; either version 3, or (at your option) any
178 later version.
179
180 Math-NumSeq is distributed in the hope that it will be useful, but
181 WITHOUT ANY WARRANTY; without even the implied warranty of
182 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
183 General Public License for more details.
184
185 You should have received a copy of the GNU General Public License along
186 with Math-NumSeq. If not, see <http://www.gnu.org/licenses/>.
187
188
189
190perl v5.28.1 2016-03-19 Math::NumSeq::OEIS(3)