pspline 5.0.5 → 5.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile +5 -5
- data/README.md +44 -43
- data/Rakefile +6 -6
- data/bin/console +14 -14
- data/bin/setup +8 -8
- data/ext/pspline/basis.cpp +394 -351
- data/ext/pspline/example/exbspline.rb +57 -57
- data/ext/pspline/example/excspline.rb +57 -57
- data/ext/pspline/example/exdspline.rb +55 -55
- data/ext/pspline/example/exfspline.rb +44 -44
- data/ext/pspline/example/exfspline1.rb +40 -40
- data/ext/pspline/example/exfspline2.rb +68 -68
- data/ext/pspline/example/exfspline3.rb +64 -64
- data/ext/pspline/example/exmspline.rb +68 -68
- data/ext/pspline/example/expspline.rb +29 -29
- data/ext/pspline/example/expspline1.rb +29 -29
- data/ext/pspline/example/expspline2.rb +47 -47
- data/ext/pspline/example/exqspline.rb +31 -31
- data/ext/pspline/example/exqspline1.rb +31 -31
- data/ext/pspline/example/exqspline2.rb +50 -50
- data/ext/pspline/example/exqspline3.rb +51 -51
- data/ext/pspline/example/exqspline4.rb +35 -35
- data/ext/pspline/example/exrspline.rb +34 -34
- data/ext/pspline/example/exrspline1.rb +34 -34
- data/ext/pspline/example/exrspline2.rb +44 -44
- data/ext/pspline/example/exsspline.rb +35 -35
- data/ext/pspline/example/exsspline1.rb +35 -35
- data/ext/pspline/example/extspline.rb +54 -54
- data/ext/pspline/extconf.rb +7 -7
- data/ext/pspline/fft.cpp +27 -552
- data/ext/pspline/include/basis/basis.h +145 -137
- data/ext/pspline/include/basis/fft.h +188 -152
- data/ext/pspline/include/basis/fft_complex.h +215 -0
- data/ext/pspline/include/basis/fft_real.h +625 -0
- data/ext/pspline/include/basis/gabs.h +35 -0
- data/ext/pspline/include/basis/marray_class_ext.h +568 -0
- data/ext/pspline/include/basis/marray_ext.h +100 -0
- data/ext/pspline/include/basis/matrix_luc_ext.h +300 -0
- data/ext/pspline/include/basis/matrix_lud_ext.h +298 -0
- data/ext/pspline/include/basis/poly.h +454 -0
- data/ext/pspline/include/basis/poly_array.h +1030 -1568
- data/ext/pspline/include/basis/pspline.h +806 -642
- data/ext/pspline/include/basis/real.h +526 -0
- data/ext/pspline/include/basis/real_inline.h +442 -0
- data/ext/pspline/include/basis/spline.h +83 -0
- data/ext/pspline/include/basis/uspline.h +251 -210
- data/ext/pspline/include/basis/util.h +122 -656
- data/ext/pspline/include/bspline.h +71 -377
- data/ext/pspline/include/bspline_Config.h +8 -2
- data/ext/pspline/include/real_config.h +3 -0
- data/ext/pspline/pspline.cpp +1236 -1038
- data/ext/pspline/real.cpp +1607 -0
- data/ext/pspline/real_const.cpp +585 -0
- data/lib/pspline.rb +71 -71
- data/lib/pspline/version.rb +1 -1
- data/pspline.gemspec +25 -25
- metadata +17 -5
- data/ext/pspline/plotsub.cpp +0 -139
- data/ext/pspline/util.cpp +0 -483
|
@@ -0,0 +1,454 @@
|
|
|
1
|
+
#ifndef _POLY_H_
|
|
2
|
+
#define _POLY_H_
|
|
3
|
+
|
|
4
|
+
template <typename T>
|
|
5
|
+
void poly_subst(int n, T *w)
|
|
6
|
+
{
|
|
7
|
+
for (int i = 0; i <= n; ++i) w[i] = T(0);
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
template <typename T, class... Args>
|
|
11
|
+
void poly_subst(int n, T *w, T car, Args... cdr)
|
|
12
|
+
{
|
|
13
|
+
w[0] = car; if (n > 0) poly_subst<T>(n-1, &w[1], cdr...);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/*******************************************************************************
|
|
17
|
+
poly<T,N>(T[N]);
|
|
18
|
+
[T0,...,TN]
|
|
19
|
+
*******************************************************************************/
|
|
20
|
+
template<typename T> class poly
|
|
21
|
+
{
|
|
22
|
+
|
|
23
|
+
size_t N; T *w; // data fields
|
|
24
|
+
|
|
25
|
+
public:
|
|
26
|
+
// constructor
|
|
27
|
+
poly() : N(0), w(NULL) {}
|
|
28
|
+
// poly<N>(T0, ...);
|
|
29
|
+
template<class... Args>
|
|
30
|
+
poly(const T car, const Args... cdr) : N(sizeof...(cdr)), w(new T[N])
|
|
31
|
+
{
|
|
32
|
+
w[0] = car; if (N > 0) poly_subst(N-1, &w[1], cdr...);
|
|
33
|
+
}
|
|
34
|
+
// copy construtor
|
|
35
|
+
poly(const poly& p) : N(p.N), w(new T[N])
|
|
36
|
+
{
|
|
37
|
+
for (size_t i = 0; i <= N; i++) w[i] = p.w[i];
|
|
38
|
+
}
|
|
39
|
+
// default destructor
|
|
40
|
+
~poly() { delete[] w; }
|
|
41
|
+
// assignment operator
|
|
42
|
+
poly& operator = (const poly& p)
|
|
43
|
+
{
|
|
44
|
+
if (this != &p) {
|
|
45
|
+
delete[] w;
|
|
46
|
+
N = p.N; w = new T[N];
|
|
47
|
+
for (size_t i = 0; i <= N; i++) w[i] = p.w[i];
|
|
48
|
+
}
|
|
49
|
+
return *this;
|
|
50
|
+
}
|
|
51
|
+
// assignment grid size
|
|
52
|
+
poly& operator = (const T *a)
|
|
53
|
+
{
|
|
54
|
+
for(size_t i = 0; i < N; ++i) w[i] = a[i];
|
|
55
|
+
return *this;
|
|
56
|
+
}
|
|
57
|
+
// assignment unit size
|
|
58
|
+
poly& operator = (const T a)
|
|
59
|
+
{
|
|
60
|
+
w[N] = a;
|
|
61
|
+
return *this;
|
|
62
|
+
}
|
|
63
|
+
char *to_s(const char *f = "%g") const
|
|
64
|
+
{
|
|
65
|
+
str_buf c;
|
|
66
|
+
c += '<';
|
|
67
|
+
for (size_t i = 0; i <= N; i++) {
|
|
68
|
+
sprintg(c, w[i], f);
|
|
69
|
+
if (i < N) c += ',';
|
|
70
|
+
}
|
|
71
|
+
c += '>';
|
|
72
|
+
char *result = new char[c.size() + 1];
|
|
73
|
+
strcpy(result, c.c_str());
|
|
74
|
+
return result;
|
|
75
|
+
}
|
|
76
|
+
void fprint(FILE *f, const char *fmt = "%g\n") const { gprint(*this, f, fmt); }
|
|
77
|
+
void print(const char *fmt = "%g\n") const { this->fprint(stdout, fmt); }
|
|
78
|
+
|
|
79
|
+
}; // end of poly;
|
|
80
|
+
|
|
81
|
+
typedef unsigned short UTYPE;
|
|
82
|
+
|
|
83
|
+
const size_t _Z = 7;
|
|
84
|
+
|
|
85
|
+
template <> class poly<int>
|
|
86
|
+
{
|
|
87
|
+
UTYPE w[_Z+1];
|
|
88
|
+
|
|
89
|
+
public:
|
|
90
|
+
|
|
91
|
+
// default constructor
|
|
92
|
+
poly() { for (UTYPE &z : w) z = 0; }
|
|
93
|
+
// general constructor
|
|
94
|
+
poly(size_t n)
|
|
95
|
+
{
|
|
96
|
+
for (size_t i = 0; i < _Z; ++i) w[i] = 0;
|
|
97
|
+
w[_Z] = static_cast<UTYPE>(n);
|
|
98
|
+
}
|
|
99
|
+
template<class... Args>
|
|
100
|
+
poly(const int car, const Args... cdr)
|
|
101
|
+
{
|
|
102
|
+
size_t N = sizeof...(cdr);
|
|
103
|
+
assert(N < _Z);
|
|
104
|
+
w[0] = car; if (N > 0) poly_subst<UTYPE>(int(N-1), &w[1], cdr...);
|
|
105
|
+
w[_Z] = static_cast<UTYPE>(N);
|
|
106
|
+
}
|
|
107
|
+
poly(int n, int *s)
|
|
108
|
+
{
|
|
109
|
+
size_t N = n;
|
|
110
|
+
assert(N < _Z);
|
|
111
|
+
for (size_t i = 0; i < _Z; ++i)
|
|
112
|
+
w[i] = (i <= N) ? static_cast<UTYPE>(s[i]) : 0;
|
|
113
|
+
w[_Z] = static_cast<UTYPE>(N);
|
|
114
|
+
}
|
|
115
|
+
poly(int n, const int *s, int m)
|
|
116
|
+
{
|
|
117
|
+
size_t N = n;
|
|
118
|
+
assert(N < _Z);
|
|
119
|
+
for (size_t i = 0; i < _Z; ++i)
|
|
120
|
+
w[i] = (i < N) ? static_cast<UTYPE>(s[i]) : 0;
|
|
121
|
+
w[N] = m;
|
|
122
|
+
w[_Z] = static_cast<UTYPE>(N);
|
|
123
|
+
}
|
|
124
|
+
// default copy constructor
|
|
125
|
+
// default destructor
|
|
126
|
+
// assignment operator
|
|
127
|
+
poly& operator = (const poly& p)
|
|
128
|
+
{
|
|
129
|
+
if (this != &p) for (size_t i = 0; i <= _Z; ++i) w[i] = p.w[i];
|
|
130
|
+
return *this;
|
|
131
|
+
}
|
|
132
|
+
// assignment grid size
|
|
133
|
+
poly& operator = (const int *s)
|
|
134
|
+
{
|
|
135
|
+
size_t N = static_cast<size_t>(w[_Z]);
|
|
136
|
+
for (size_t i = 0; i < N; ++i)
|
|
137
|
+
w[i] = static_cast<UTYPE>(s[i]);
|
|
138
|
+
return *this;
|
|
139
|
+
}
|
|
140
|
+
// assignment unit size
|
|
141
|
+
poly& operator = (int t)
|
|
142
|
+
{
|
|
143
|
+
size_t N = static_cast<size_t>(w[_Z]);
|
|
144
|
+
w[N] = static_cast<UTYPE>(t);
|
|
145
|
+
return *this;
|
|
146
|
+
}
|
|
147
|
+
friend poly operator * (const poly& p, const poly& q)
|
|
148
|
+
{
|
|
149
|
+
size_t N = static_cast<size_t>(q.w[_Z]);
|
|
150
|
+
assert(q.w[_Z] == p.w[_Z]);
|
|
151
|
+
poly result(N);
|
|
152
|
+
for (size_t i=0;i<N;++i) result.w[i] = p.w[i] * q.w[i];
|
|
153
|
+
result.w[N] = p.w[N];
|
|
154
|
+
return result;
|
|
155
|
+
}
|
|
156
|
+
friend poly operator * (const poly& p, int a)
|
|
157
|
+
{
|
|
158
|
+
int N = static_cast<int>(p.w[_Z]);
|
|
159
|
+
poly result(N);
|
|
160
|
+
for (int i=0;i<N;++i) result.w[i] = p.w[i] * static_cast<UTYPE>(a);
|
|
161
|
+
result.w[N] = p.w[N];
|
|
162
|
+
return result;
|
|
163
|
+
}
|
|
164
|
+
friend poly operator * (int a, const poly& p)
|
|
165
|
+
{
|
|
166
|
+
return (p * a);
|
|
167
|
+
}
|
|
168
|
+
friend poly operator + (const poly& p, const poly& q)
|
|
169
|
+
{
|
|
170
|
+
assert(q.w[_Z] == p.w[_Z]);
|
|
171
|
+
size_t N = static_cast<size_t>(p.w[_Z]);
|
|
172
|
+
poly result(N);
|
|
173
|
+
for (size_t i=0;i<N;++i) result.w[i] = p.w[i] + q.w[i];
|
|
174
|
+
result.w[N] = p.w[N];
|
|
175
|
+
return result;
|
|
176
|
+
}
|
|
177
|
+
friend poly operator + (const poly& p, int a)
|
|
178
|
+
{
|
|
179
|
+
size_t N = static_cast<size_t>(p.w[_Z]);
|
|
180
|
+
poly result(N);
|
|
181
|
+
for (size_t i=0;i<N;++i) result.w[i] = p.w[i] + static_cast<UTYPE>(a);
|
|
182
|
+
result.w[N] = p.w[N];
|
|
183
|
+
return result;
|
|
184
|
+
}
|
|
185
|
+
friend poly operator + (int a, const poly& p)
|
|
186
|
+
{
|
|
187
|
+
return (p + a);
|
|
188
|
+
}
|
|
189
|
+
friend poly operator - (const poly& p, const poly& q)
|
|
190
|
+
{
|
|
191
|
+
assert(q.w[_Z] == p.w[_Z]);
|
|
192
|
+
size_t N = static_cast<size_t>(p.w[_Z]);
|
|
193
|
+
poly result(N);
|
|
194
|
+
for (size_t i=0;i<N;++i) result.w[i] = p.w[i] - q.w[i];
|
|
195
|
+
result.w[N] = p.w[N];
|
|
196
|
+
return result;
|
|
197
|
+
}
|
|
198
|
+
friend poly operator - (const poly& p, int a)
|
|
199
|
+
{
|
|
200
|
+
size_t N = static_cast<size_t>(p.w[_Z]);
|
|
201
|
+
poly result(N);
|
|
202
|
+
for (size_t i=0;i<N;++i) result.w[i] = p.w[i] - static_cast<UTYPE>(a);
|
|
203
|
+
result.w[N] = p.w[N];
|
|
204
|
+
return result;
|
|
205
|
+
}
|
|
206
|
+
friend poly operator - (int a, const poly& p)
|
|
207
|
+
{
|
|
208
|
+
size_t N = static_cast<size_t>(p.w[_Z]);
|
|
209
|
+
poly result(N);
|
|
210
|
+
for (size_t i=0;i<N;++i) result.w[i] = static_cast<UTYPE>(a) - p.w[i];
|
|
211
|
+
result.w[N] = p.w[N];
|
|
212
|
+
return result;
|
|
213
|
+
}
|
|
214
|
+
poly operator % (int a) const
|
|
215
|
+
{
|
|
216
|
+
size_t N = static_cast<size_t>(w[_Z]);
|
|
217
|
+
poly result(N);
|
|
218
|
+
for (size_t i=0;i<N;++i)
|
|
219
|
+
result.w[i] = w[i] % a;
|
|
220
|
+
result.w[N] = w[N];
|
|
221
|
+
return result;
|
|
222
|
+
}
|
|
223
|
+
poly& operator += (int a)
|
|
224
|
+
{
|
|
225
|
+
size_t N = static_cast<size_t>(w[_Z]);
|
|
226
|
+
for(size_t i=0;i<N;i++) w[i] += static_cast<UTYPE>(a);
|
|
227
|
+
return *this;
|
|
228
|
+
}
|
|
229
|
+
poly& operator -= (int a)
|
|
230
|
+
{
|
|
231
|
+
size_t N = static_cast<size_t>(w[_Z]);
|
|
232
|
+
for(size_t i=0;i<N;i++) w[i] -= static_cast<UTYPE>(a);
|
|
233
|
+
return *this;
|
|
234
|
+
}
|
|
235
|
+
bool operator == (const poly& p) const
|
|
236
|
+
{
|
|
237
|
+
size_t N = static_cast<size_t>(w[_Z]);
|
|
238
|
+
size_t i; for(i=0;i<=N;++i) if(w[i] != p.w[i]) break;
|
|
239
|
+
return i > N;
|
|
240
|
+
}
|
|
241
|
+
bool operator != (const poly& p) const
|
|
242
|
+
{
|
|
243
|
+
size_t N = static_cast<size_t>(w[_Z]);
|
|
244
|
+
size_t i; for(i=0;i<=N;i++) if(w[i] != p.w[i]) break;
|
|
245
|
+
return i <= N;
|
|
246
|
+
}
|
|
247
|
+
bool operator > (const poly& p) const
|
|
248
|
+
{
|
|
249
|
+
size_t N = static_cast<size_t>(w[_Z]);
|
|
250
|
+
assert(w[_Z] == p.w[_Z]);
|
|
251
|
+
size_t i; for(i=0;i<N;++i) if(w[i] <= p.w[i]) break;
|
|
252
|
+
return i == N && w[N] == p.w[N];
|
|
253
|
+
}
|
|
254
|
+
bool operator >= (const poly& p) const
|
|
255
|
+
{
|
|
256
|
+
size_t N = static_cast<size_t>(w[_Z]);
|
|
257
|
+
assert(w[_Z] == p.w[_Z]);
|
|
258
|
+
size_t i; for(i=0;i<N;++i) if(w[i] < p.w[i]) break;
|
|
259
|
+
return i == N && w[N] == p.w[N];
|
|
260
|
+
}
|
|
261
|
+
bool operator < (const poly& p) const
|
|
262
|
+
{
|
|
263
|
+
size_t N = static_cast<size_t>(w[_Z]);
|
|
264
|
+
assert(w[_Z] == p.w[_Z]);
|
|
265
|
+
size_t i; for(i=0;i<N;i++) if(w[i] >= p.w[i]) break;
|
|
266
|
+
return i == N && w[N] == p.w[N];
|
|
267
|
+
}
|
|
268
|
+
bool operator <= (const poly& p) const
|
|
269
|
+
{
|
|
270
|
+
size_t N = static_cast<size_t>(w[_Z]);
|
|
271
|
+
assert(w[_Z] == p.w[_Z]);
|
|
272
|
+
size_t i; for(i=0;i<N;i++) if(w[i] > p.w[i]) break;
|
|
273
|
+
return i == N && w[N] == p.w[N];
|
|
274
|
+
}
|
|
275
|
+
bool operator == (int a) const
|
|
276
|
+
{
|
|
277
|
+
size_t N = static_cast<size_t>(w[_Z]);
|
|
278
|
+
size_t i;
|
|
279
|
+
for (i = 0; i < N; ++i) if (w[i] != a) break;
|
|
280
|
+
return i == N;
|
|
281
|
+
}
|
|
282
|
+
bool operator != (int a) const
|
|
283
|
+
{
|
|
284
|
+
size_t N = static_cast<size_t>(w[_Z]);
|
|
285
|
+
size_t i;
|
|
286
|
+
for (i = 0; i < N; ++i) if (w[i] != a) break;
|
|
287
|
+
return i != N;
|
|
288
|
+
}
|
|
289
|
+
bool operator < (int a) const
|
|
290
|
+
{
|
|
291
|
+
size_t N = static_cast<size_t>(w[_Z]);
|
|
292
|
+
size_t i;
|
|
293
|
+
for (i = 0; i < N; ++i) if (w[i] >= a) break;
|
|
294
|
+
return i == N;
|
|
295
|
+
}
|
|
296
|
+
bool operator >= (int a) const
|
|
297
|
+
{
|
|
298
|
+
size_t N = static_cast<size_t>(w[_Z]);
|
|
299
|
+
size_t i;
|
|
300
|
+
for (i = 0; i < N; ++i) if (w[i] < a) break;
|
|
301
|
+
return i == N;
|
|
302
|
+
}
|
|
303
|
+
bool operator > (int a) const
|
|
304
|
+
{
|
|
305
|
+
size_t N = static_cast<size_t>(w[_Z]);
|
|
306
|
+
size_t i;
|
|
307
|
+
for (i = 0; i < N; ++i) if (w[i] <= a) break;
|
|
308
|
+
return i == N;
|
|
309
|
+
}
|
|
310
|
+
bool operator <= (int a) const
|
|
311
|
+
{
|
|
312
|
+
size_t N = static_cast<size_t>(w[_Z]);
|
|
313
|
+
size_t i;
|
|
314
|
+
for (i = 0; i < N; ++i) if (w[i] > a) break;
|
|
315
|
+
return i == N;
|
|
316
|
+
}
|
|
317
|
+
// member function
|
|
318
|
+
size_t length() const {return static_cast<size_t>(w[_Z]) + 1;}
|
|
319
|
+
size_t grid() const { return static_cast<size_t>(w[_Z]); }
|
|
320
|
+
size_t grid(size_t i) const { return static_cast<size_t>(w[i]); }
|
|
321
|
+
size_t atom() const { return grid(static_cast<size_t>(w[_Z])); }
|
|
322
|
+
size_t unit() const { return grid(static_cast<size_t>(w[_Z])-1); }
|
|
323
|
+
size_t line() const { return grid(static_cast<size_t>(w[_Z])-2); }
|
|
324
|
+
size_t plat() const { return grid(static_cast<size_t>(w[_Z])-3); }
|
|
325
|
+
size_t cube() const { return grid(static_cast<size_t>(w[_Z])-4); }
|
|
326
|
+
size_t grid_size(size_t n = 0) const
|
|
327
|
+
{
|
|
328
|
+
size_t N = static_cast<size_t>(w[_Z]);
|
|
329
|
+
assert(n <= N);
|
|
330
|
+
size_t z = 1;
|
|
331
|
+
for (size_t i = N - n; i > 0; --i) z *= static_cast<size_t>(w[i-1]);
|
|
332
|
+
return z;
|
|
333
|
+
}
|
|
334
|
+
size_t atom_size() const { return grid_size(0); }
|
|
335
|
+
size_t unit_size() const { return grid_size(1); }
|
|
336
|
+
size_t line_size() const { return grid_size(2); }
|
|
337
|
+
size_t plat_size() const { return grid_size(3); }
|
|
338
|
+
size_t cube_size() const { return grid_size(4); }
|
|
339
|
+
// w[n] * ... * w[N-1] * w[N]
|
|
340
|
+
size_t data_size(size_t n = 0) const
|
|
341
|
+
{
|
|
342
|
+
size_t N = static_cast<size_t>(w[_Z]);
|
|
343
|
+
size_t z = (n > N) ? 1 : (static_cast<size_t>(w[N]) + 1);
|
|
344
|
+
for(size_t i = N; i > n; --i) z *= static_cast<size_t>(w[i-1]);
|
|
345
|
+
return z;
|
|
346
|
+
}
|
|
347
|
+
// (w[m] + ... + w[n-1]) * w[N]
|
|
348
|
+
size_t comb_size(size_t n = 0) const
|
|
349
|
+
{
|
|
350
|
+
size_t N = static_cast<size_t>(w[_Z]);
|
|
351
|
+
assert(n < N);
|
|
352
|
+
size_t z = 0;
|
|
353
|
+
for(size_t i = N; i > n; --i) z += static_cast<size_t>(w[i-1]);
|
|
354
|
+
return z * (static_cast<size_t>(w[N]) + 1);
|
|
355
|
+
}
|
|
356
|
+
// (w[m] + ... + w[n-1]) * w[N-1] * w[N]
|
|
357
|
+
size_t cast_size(size_t n, size_t m = 0) const
|
|
358
|
+
{
|
|
359
|
+
size_t N = static_cast<size_t>(w[_Z]);
|
|
360
|
+
assert(0 < N && n < N && m <= n);
|
|
361
|
+
size_t z = 0;
|
|
362
|
+
for(size_t i = m; i < n; ++i) z += static_cast<size_t>(w[i]);
|
|
363
|
+
return z * data_size(N-1);
|
|
364
|
+
}
|
|
365
|
+
// w[0] + ... + w[N-1]
|
|
366
|
+
size_t band() const
|
|
367
|
+
{
|
|
368
|
+
size_t N = static_cast<size_t>(w[_Z]);
|
|
369
|
+
size_t z = 0;
|
|
370
|
+
for (size_t k = 0; k < N; ++k) z += static_cast<size_t>(w[k]);
|
|
371
|
+
return z;
|
|
372
|
+
}
|
|
373
|
+
size_t band_size(size_t i = 0) const
|
|
374
|
+
{
|
|
375
|
+
size_t N = static_cast<size_t>(w[_Z]);
|
|
376
|
+
assert(i <= N);
|
|
377
|
+
size_t z = 0;
|
|
378
|
+
for (size_t k = 0; k < i; ++k) z += static_cast<size_t>(w[k]);
|
|
379
|
+
return z * (static_cast<size_t>(w[N]) + 1);
|
|
380
|
+
}
|
|
381
|
+
// calculate Atom Position
|
|
382
|
+
size_t operator && (const poly& q) const
|
|
383
|
+
{
|
|
384
|
+
size_t N = static_cast<size_t>(w[_Z]);
|
|
385
|
+
size_t M = static_cast<size_t>(q.w[_Z]);
|
|
386
|
+
assert(N >= M);
|
|
387
|
+
size_t sum = static_cast<size_t>(q.w[M]) * data_size(M+1);
|
|
388
|
+
size_t sek = static_cast<size_t>(w[N]) + 1;
|
|
389
|
+
for (size_t i = N; i > 0; --i) {
|
|
390
|
+
if (i <= M)
|
|
391
|
+
sum += sek * static_cast<size_t>(q.w[i-1]);
|
|
392
|
+
sek *= static_cast<size_t>(w[i-1]);
|
|
393
|
+
}
|
|
394
|
+
return sum;
|
|
395
|
+
}
|
|
396
|
+
// Modular operation : Unit No. -> Poly Grid.
|
|
397
|
+
friend poly operator % (size_t a, const poly& q)
|
|
398
|
+
{
|
|
399
|
+
size_t N = static_cast<size_t>(q.w[_Z]);
|
|
400
|
+
poly p(N);
|
|
401
|
+
for (size_t i = N; i > 0; --i) {
|
|
402
|
+
size_t t = static_cast<size_t>(q.w[i-1]);
|
|
403
|
+
p.w[i-1] = static_cast<UTYPE>(a % t);
|
|
404
|
+
a /= t;
|
|
405
|
+
} p.w[N] = 0;
|
|
406
|
+
return p;
|
|
407
|
+
}
|
|
408
|
+
// Referrece of element.
|
|
409
|
+
int operator[] (int n) const { return static_cast<int>(w[n]); }
|
|
410
|
+
UTYPE& operator[] (int i) { return w[i]; }
|
|
411
|
+
poly operator<<(int i) const
|
|
412
|
+
{
|
|
413
|
+
size_t N = static_cast<int>(w[_Z]), M = N - i;
|
|
414
|
+
poly z(M);
|
|
415
|
+
for (size_t j = 0; j <= M; ++j) z.w[j] = w[static_cast<size_t>(i)+j];
|
|
416
|
+
return z;
|
|
417
|
+
}
|
|
418
|
+
poly operator>>(int i) const
|
|
419
|
+
{
|
|
420
|
+
size_t N = static_cast<int>(w[_Z]), M = N - i;
|
|
421
|
+
poly z(M);
|
|
422
|
+
size_t t = data_size(M);
|
|
423
|
+
for (size_t j = 0; j < M; ++j) z.w[j] = w[j];
|
|
424
|
+
z.w[M] = static_cast<UTYPE>(t);
|
|
425
|
+
return z;
|
|
426
|
+
}
|
|
427
|
+
char *to_s(const char *f = "%d") const
|
|
428
|
+
{
|
|
429
|
+
size_t N = static_cast<size_t>(w[_Z]);
|
|
430
|
+
str_buf c;
|
|
431
|
+
c += '<';
|
|
432
|
+
if (N > 0) {
|
|
433
|
+
c += '{';
|
|
434
|
+
for (size_t i = 0; i < N; i++) {
|
|
435
|
+
sprintg(c, (int)w[i], f);
|
|
436
|
+
if (i < N-1) c += ',';
|
|
437
|
+
}
|
|
438
|
+
c += "},";
|
|
439
|
+
} sprintg(c, (int)w[N], f);
|
|
440
|
+
c += '>';
|
|
441
|
+
char *result = new char[c.size() + 1];
|
|
442
|
+
strcpy(result, c.c_str());
|
|
443
|
+
return result;
|
|
444
|
+
}
|
|
445
|
+
void fprint(FILE *f, const char *fmt = "%d\n") const { gprint(*this, f, fmt); }
|
|
446
|
+
void print(const char *fmt = "%d\n") const { this->fprint(stdout, fmt); }
|
|
447
|
+
|
|
448
|
+
}; // end of poly<int>;
|
|
449
|
+
|
|
450
|
+
typedef poly<int> Int;
|
|
451
|
+
|
|
452
|
+
#include "basis/real.h"
|
|
453
|
+
|
|
454
|
+
#endif
|