diff --git a/lib/node_modules/@stdlib/fft/base/fftpack/rffti/README.md b/lib/node_modules/@stdlib/fft/base/fftpack/rffti/README.md new file mode 100644 index 000000000000..4aa185aefa1f --- /dev/null +++ b/lib/node_modules/@stdlib/fft/base/fftpack/rffti/README.md @@ -0,0 +1,168 @@ + + +# rffti + +> Initialize a workspace array for performing a real-valued Fourier transform. + + + +
+ +
+ + + + + +
+ +## Usage + +```javascript +var rffti = require( '@stdlib/fft/base/fftpack/rffti' ); +``` + +#### rffti( N, workspace, strideW, offsetW ) + +Initializes a workspace array for performing a real-valued Fourier transform. + +```javascript +var Float64Array = require( '@stdlib/array/float64' ); + +var N = 8; +var workspace = new Float64Array( ( 2*N ) + 34 ); + +rffti( N, workspace, 1, 0 ); + +var twiddleFactors = workspace.slice( N, 2*N ); +// returns [ 0, ~0.707, ~0.707, 0, 0, 0, 0, 0 ] + +var factors = workspace.slice( 2*N, ( 2*N ) + 4 ); +// returns [ 8, 2, 2, 4 ] +``` + +The function accepts the following arguments: + +- **N**: length of the sequence to transform. +- **workspace**: workspace array. +- **strideW**: stride length for `workspace`. +- **offsetW**: starting index for `workspace`. + +
+ + + + + +
+ +## Notes + +- The workspace array is divided into three sections: + + ```text + size = N N 2+ceil(log2(N)/2) + ↓ ↓ ↓ + | scratch / workspace | twiddle factors | radix factor table | + ↑ ↑ ↑ + i = 0 ... N ... 2N ... + ``` + + - **scratch/workspace**: used as a scratch space when performing transforms. This section is not updated during initialization. + - **twiddle factors**: a table of reusable complex-exponential constants stored as cosine/sine pairs. + - **radix factor table**: a table containing the sequence length `N`, the number of factors into which `N` was decomposed, and the individual integer radix factors. + +- In general, a workspace array should have `2N + 34` indexed elements (as `log2(N)/2 ≤ 32` for all `2^64`). During initialization, only the sections for storing twiddle factors and the factorization of `N` are updated. + +- The radix factor table is comprised as follows: + + ```text + | sequence_length | number_of_factors | integer_factors | + ``` + +- If `N` equals `1`, the function returns early without modifying the workspace, as a single data point is its own Fourier transform. + +
+ + + +
+ +## Examples + + + +```javascript +var Float64Array = require( '@stdlib/array/float64' ); +var rffti = require( '@stdlib/fft/base/fftpack/rffti' ); + +var workspace; +var N; +var nf; +var i; +var j; + +N = 8; +workspace = new Float64Array( ( 2*N ) + 34 ); + +rffti( N, workspace, 1, 0 ); + +console.log( 'Sequence length: %d', N ); +console.log( 'Twiddle factors:' ); +for ( i = N; i < 2*N; i++ ) { + console.log( ' workspace[%d] = %d', i, workspace[ i ] ); +} + +console.log( 'Factorization:' ); +nf = workspace[ ( 2*N ) + 1 ]; +console.log( ' number of factors: %d', nf ); +for ( j = 0; j < nf; j++ ) { + console.log( ' factor[%d]: %d', j, workspace[ ( 2*N ) + 2 + j ] ); +} +``` + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + diff --git a/lib/node_modules/@stdlib/fft/base/fftpack/rffti/benchmark/benchmark.js b/lib/node_modules/@stdlib/fft/base/fftpack/rffti/benchmark/benchmark.js new file mode 100644 index 000000000000..07feddfa216b --- /dev/null +++ b/lib/node_modules/@stdlib/fft/base/fftpack/rffti/benchmark/benchmark.js @@ -0,0 +1,101 @@ +/* +* @license Apache-2.0 +* +* Copyright (c) 2026 The Stdlib Authors. +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +'use strict'; + +// MODULES // + +var bench = require( '@stdlib/bench' ); +var format = require( '@stdlib/string/format' ); +var isnan = require( '@stdlib/math/base/assert/is-nan' ); +var Float64Array = require( '@stdlib/array/float64' ); +var pkg = require( './../package.json' ).name; +var rffti = require( './../lib' ); + + +// FUNCTIONS // + +/** +* Creates a benchmark function. +* +* @private +* @param {PositiveInteger} N - sequence length +* @returns {Function} benchmark function +*/ +function createBenchmark( N ) { + var workspace = new Float64Array( ( 2*N ) + 34 ); + return benchmark; + + /** + * Benchmark function. + * + * @private + * @param {Benchmark} b - benchmark instance + */ + function benchmark( b ) { + var i; + + b.tic(); + for ( i = 0; i < b.iterations; i++ ) { + rffti( N, workspace, 1, 0 ); + if ( isnan( workspace[ N+1 ] ) ) { + b.fail( 'should not return NaN' ); + } + } + b.toc(); + if ( isnan( workspace[ N+1 ] ) ) { + b.fail( 'should not return NaN' ); + } + b.pass( 'benchmark finished' ); + b.end(); + } +} + + +// MAIN // + +/** +* Main execution sequence. +* +* @private +*/ +function main() { + var lengths; + var N; + var f; + var i; + + lengths = [ + 8, + 16, + 32, + 64, + 128, + 256, + 512, + 1024 + ]; + + for ( i = 0; i < lengths.length; i++ ) { + N = lengths[ i ]; + f = createBenchmark( N ); + bench( format( '%s:N=%d', pkg, N ), f ); + } +} + +main(); diff --git a/lib/node_modules/@stdlib/fft/base/fftpack/rffti/docs/repl.txt b/lib/node_modules/@stdlib/fft/base/fftpack/rffti/docs/repl.txt new file mode 100644 index 000000000000..aa886670dc67 --- /dev/null +++ b/lib/node_modules/@stdlib/fft/base/fftpack/rffti/docs/repl.txt @@ -0,0 +1,45 @@ + +{{alias}}( N, workspace, strideW, offsetW ) + Initializes a workspace array for performing a real-valued Fourier + transform. + + The workspace array is divided into three sections: scratch/workspace + (indices 0 to N-1), twiddle factors (indices N to 2N-1), and radix factor + table (indices 2N onwards). + + The scratch/workspace section is used while performing transforms and is + not updated during initialization. The twiddle factors section stores a + table of reusable complex exponential constants as cosine/sine pairs. The + radix factor table stores the sequence length N, the number of factors into + which N was decomposed, and the individual integer radix factors. + + Any remaining array space remains as unused storage. + + Parameters + ---------- + N: integer + Length of the sequence. + + workspace: ArrayLikeObject + Workspace array. + + strideW: integer + Stride length for `workspace`. + + offsetW: integer + Starting index for `workspace`. + + Examples + -------- + > var {{alias:@stdlib/array/float64}} = require( '@stdlib/array/float64' ); + > var N = 8; + > var workspace = new {{alias:@stdlib/array/float64}}( ( 2*N ) + 34 ); + > {{alias}}( N, workspace, 1, 0 ); + > var twiddleFactors = workspace.slice( N, 2*N ) + [ 0, ~0.707, ~0.707, 0, 0, 0, 0, 0 ] + > var factors = workspace.slice( 2*N, ( 2*N ) + 4 ) + [ 8, 2, 2, 4 ] + + See Also + -------- + diff --git a/lib/node_modules/@stdlib/fft/base/fftpack/rffti/docs/types/index.d.ts b/lib/node_modules/@stdlib/fft/base/fftpack/rffti/docs/types/index.d.ts new file mode 100644 index 000000000000..2c55a4abb09d --- /dev/null +++ b/lib/node_modules/@stdlib/fft/base/fftpack/rffti/docs/types/index.d.ts @@ -0,0 +1,51 @@ +/* +* @license Apache-2.0 +* +* Copyright (c) 2026 The Stdlib Authors. +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +// TypeScript Version: 4.1 + +/// + +import { Collection } from '@stdlib/types/array'; + +/** +* Initializes a workspace array for performing a real-valued Fourier transform. +* +* @param N - length of the sequence +* @param workspace - workspace array +* @param strideW - stride length for `workspace` +* @param offsetW - starting index for `workspace` +* +* @example +* var Float64Array = require( '@stdlib/array/float64' ); +* var N = 8; +* var workspace = new Float64Array( ( 2*N ) + 34 ); +* +* rffti( N, workspace, 1, 0 ); +* +* var twiddleFactors = workspace.slice( N, 2*N ); +* // returns [ 0, ~0.707, ~0.707, 0, 0, 0, 0, 0 ] +* +* var factors = workspace.slice( 2*N, ( 2*N ) + 4 ); +* // returns [ 8, 2, 2, 4 ] +*/ +declare function rffti( N: number, workspace: Collection, strideW: number, offsetW: number ): void; + + +// EXPORTS // + +export = rffti; diff --git a/lib/node_modules/@stdlib/fft/base/fftpack/rffti/docs/types/test.ts b/lib/node_modules/@stdlib/fft/base/fftpack/rffti/docs/types/test.ts new file mode 100644 index 000000000000..a01b8b17546f --- /dev/null +++ b/lib/node_modules/@stdlib/fft/base/fftpack/rffti/docs/types/test.ts @@ -0,0 +1,93 @@ +/* +* @license Apache-2.0 +* +* Copyright (c) 2026 The Stdlib Authors. +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +import rffti = require( './index' ); + +// TESTS // + +// The function returns void... +{ + const workspace = new Float64Array( ( 2*8 ) + 34 ); + + rffti( 8, workspace, 1, 0 ); // $ExpectType void +} + +// The compiler throws an error if the function is provided a first argument which is not a number... +{ + const workspace = new Float64Array( ( 2*8 ) + 34 ); + + rffti( '8', workspace, 1, 0 ); // $ExpectError + rffti( true, workspace, 1, 0 ); // $ExpectError + rffti( false, workspace, 1, 0 ); // $ExpectError + rffti( null, workspace, 1, 0 ); // $ExpectError + rffti( void 0, workspace, 1, 0 ); // $ExpectError + rffti( [], workspace, 1, 0 ); // $ExpectError + rffti( {}, workspace, 1, 0 ); // $ExpectError + rffti( ( x: number ): number => x, workspace, 1, 0 ); // $ExpectError +} + +// The compiler throws an error if the function is provided a second argument which is not an array of numbers... +{ + rffti( 8, '50', 1, 0 ); // $ExpectError + rffti( 8, 50, 1, 0 ); // $ExpectError + rffti( 8, true, 1, 0 ); // $ExpectError + rffti( 8, false, 1, 0 ); // $ExpectError + rffti( 8, null, 1, 0 ); // $ExpectError + rffti( 8, void 0, 1, 0 ); // $ExpectError + rffti( 8, {}, 1, 0 ); // $ExpectError + rffti( 8, ( x: number ): number => x, 1, 0 ); // $ExpectError +} + +// The compiler throws an error if the function is provided a third argument which is not a number... +{ + const workspace = new Float64Array( ( 2*8 ) + 34 ); + + rffti( 8, workspace, '1', 0 ); // $ExpectError + rffti( 8, workspace, true, 0 ); // $ExpectError + rffti( 8, workspace, false, 0 ); // $ExpectError + rffti( 8, workspace, null, 0 ); // $ExpectError + rffti( 8, workspace, void 0, 0 ); // $ExpectError + rffti( 8, workspace, [], 0 ); // $ExpectError + rffti( 8, workspace, {}, 0 ); // $ExpectError + rffti( 8, workspace, ( x: number ): number => x, 0 ); // $ExpectError +} + +// The compiler throws an error if the function is provided a fourth argument which is not a number... +{ + const workspace = new Float64Array( ( 2*8 ) + 34 ); + + rffti( 8, workspace, 1, '0' ); // $ExpectError + rffti( 8, workspace, 1, true ); // $ExpectError + rffti( 8, workspace, 1, false ); // $ExpectError + rffti( 8, workspace, 1, null ); // $ExpectError + rffti( 8, workspace, 1, void 0 ); // $ExpectError + rffti( 8, workspace, 1, [] ); // $ExpectError + rffti( 8, workspace, 1, {} ); // $ExpectError + rffti( 8, workspace, 1, ( x: number ): number => x ); // $ExpectError +} + +// The compiler throws an error if the function is provided an unsupported number of arguments... +{ + const workspace = new Float64Array( ( 2*8 ) + 34 ); + + rffti(); // $ExpectError + rffti( 8 ); // $ExpectError + rffti( 8, workspace ); // $ExpectError + rffti( 8, workspace, 1 ); // $ExpectError + rffti( 8, workspace, 1, 0, 123 ); // $ExpectError +} diff --git a/lib/node_modules/@stdlib/fft/base/fftpack/rffti/examples/index.js b/lib/node_modules/@stdlib/fft/base/fftpack/rffti/examples/index.js new file mode 100644 index 000000000000..e9004065b2ee --- /dev/null +++ b/lib/node_modules/@stdlib/fft/base/fftpack/rffti/examples/index.js @@ -0,0 +1,46 @@ +/** +* @license Apache-2.0 +* +* Copyright (c) 2026 The Stdlib Authors. +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +'use strict'; + +var Float64Array = require( '@stdlib/array/float64' ); +var rffti = require( './../lib' ); + +var workspace; +var N; +var nf; +var i; +var j; + +N = 8; +workspace = new Float64Array( ( 2*N ) + 34 ); + +rffti( N, workspace, 1, 0 ); + +console.log( 'Sequence length: %d', N ); +console.log( 'Twiddle factors:' ); +for ( i = N; i < 2*N; i++ ) { + console.log( ' workspace[%d] = %d', i, workspace[ i ] ); +} + +console.log( 'Factorization:' ); +nf = workspace[ ( 2*N ) + 1 ]; +console.log( ' number of factors: %d', nf ); +for ( j = 0; j < nf; j++ ) { + console.log( ' factor[%d]: %d', j, workspace[ ( 2*N ) + 2 + j ] ); +} diff --git a/lib/node_modules/@stdlib/fft/base/fftpack/rffti/lib/index.js b/lib/node_modules/@stdlib/fft/base/fftpack/rffti/lib/index.js new file mode 100644 index 000000000000..3c440549ebce --- /dev/null +++ b/lib/node_modules/@stdlib/fft/base/fftpack/rffti/lib/index.js @@ -0,0 +1,49 @@ +/** +* @license Apache-2.0 +* +* Copyright (c) 2026 The Stdlib Authors. +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +'use strict'; + +/** +* Initialize a workspace array for performing a real-valued Fourier transform. +* +* @module @stdlib/fft/base/fftpack/rffti +* +* @example +* var Float64Array = require( '@stdlib/array/float64' ); +* var rffti = require( '@stdlib/fft/base/fftpack/rffti' ); +* +* var N = 8; +* var workspace = new Float64Array( ( 2*N ) + 34 ); +* +* rffti( N, workspace, 1, 0 ); +* +* var twiddleFactors = workspace.slice( N, 2*N ); +* // returns [ 0, ~0.707, ~0.707, 0, 0, 0, 0, 0 ] +* +* var factors = workspace.slice( 2*N, ( 2*N ) + 4 ); +* // returns [ 8, 2, 2, 4 ] +*/ + +// MODULES // + +var main = require( './main.js' ); + + +// EXPORTS // + +module.exports = main; diff --git a/lib/node_modules/@stdlib/fft/base/fftpack/rffti/lib/main.js b/lib/node_modules/@stdlib/fft/base/fftpack/rffti/lib/main.js new file mode 100644 index 000000000000..663a19bd35cd --- /dev/null +++ b/lib/node_modules/@stdlib/fft/base/fftpack/rffti/lib/main.js @@ -0,0 +1,170 @@ +/** +* @license Apache-2.0 +* +* Copyright (c) 2026 The Stdlib Authors. +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +* +* ## Notice +* +* The original C code and copyright notice are from the [PFFFT library]{@link https://github.com/marton78/pffft/blob/0b4ee12c4ba45a4a8e567550c16d96d1679f50ce/src/fftpack.c}. The implementation follows the original, but has been modified for JavaScript. +* +* ```text +* Copyright (c) 2004 the University Corporation for Atmospheric +* Research ("UCAR"). All rights reserved. Developed by NCAR's +* Computational and Information Systems Laboratory, UCAR, +* www.cisl.ucar.edu. +* +* Redistribution and use of the Software in source and binary forms, +* with or without modification, is permitted provided that the +* following conditions are met: +* +* - Neither the names of NCAR's Computational and Information Systems +* Laboratory, the University Corporation for Atmospheric Research, +* nor the names of its sponsors or contributors may be used to +* endorse or promote products derived from this Software without +* specific prior written permission. +* +* - Redistributions of source code must retain the above copyright +* notices, this list of conditions, and the disclaimer below. +* +* - Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions, and the disclaimer below in the +* documentation and/or other materials provided with the +* distribution. +* +* THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +* EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO THE WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +* NONINFRINGEMENT. IN NO EVENT SHALL THE CONTRIBUTORS OR COPYRIGHT +* HOLDERS BE LIABLE FOR ANY CLAIM, INDIRECT, INCIDENTAL, SPECIAL, +* EXEMPLARY, OR CONSEQUENTIAL DAMAGES OR OTHER LIABILITY, WHETHER IN AN +* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE +* SOFTWARE. +* ``` +*/ + +'use strict'; + +// MODULES // + +var rffti1 = require( './rffti1.js' ); + + +// MAIN // + +/** +* Initializes a workspace array for performing a real-valued Fourier transform. +* +* ## Notes +* +* The workspace array is divided into three sections: +* +* ```text +* size = N N 2+ceil(log2(N)/2) +* ↓ ↓ ↓ +* | scratch / workspace | twiddle factors | radix factor table | +* ↑ ↑ ↑ +* i = 0 ... N ... 2N ... +* ``` +* +* where +* +* - **scratch/workspace**: used as a scratch space when performing transforms. This section is not updated during initialization. +* - **twiddle factors**: a table of reusable complex-exponential constants stored as cosine/sine pairs. +* - **radix factor table**: a table containing the radix factorization of `N`. +* +* In general, a workspace array should have `2N + 34` indexed elements (as `log2(N)/2 ≤ 32` for all `2^64`). During initialization, only the sections for storing twiddle factors and the factorization of `N` are updated. +* +* > Note: FFTPACK only requires `2N+15`, but we increase that number here to accommodate larger workspace arrays, where `N` may exceed `2^30` indexed elements. +* +* The first two sections each contain `N` elements, while the last section contains the sequence length, the number of integer factors, and, at most, `ceil(log2(N)/2)` integer radix factors. +* +* The factorization section is comprised as follows: +* +* ```text +* | sequence_length | number_of_factors | integer_factors | +* ``` +* +* The sequence length and number of factors (`nf`) comprise a single element each. Only the first `nf` elements in the integer factors section are written to, with the rest being unused. +* +* As for twiddle factors, these are small, reusable complex-exponential constants that appear inside each "butterfly" stage of a Cooley–Tukey–style FFT. Every arithmetic step in an FFT multiplies one intermediate value by some +* +* ```tex +* W_N^k +* ``` +* +* where `W_N^k` is an N-th root of unity. Formally, in a forward FFT, +* +* ```tex +* W_N^k = e^{-2\pi ik/N} +* ``` +* +* In a backward FFT, +* +* ```tex +* W_N^k = e^{+2\pi ik/N} +* ``` +* +* As may be observed, `W_N^k` for forward and backward FFTs is the same, except the sign of the exponent is flipped. As a consequence, both real and backward FFT callers can reuse the same set of twiddle factors, with those performing a forward transform (e.g., `rfftf`) multiplying with `(cos,-sin)` and those performing a backward transform (e.g., `rfftb`) multiplying with `(cos,+sin)`. +* +* Because these constants only depend on the transform length `N` (and **not** on the input data), we can pre-compute and store them once, then "twiddle" them (i.e., reuse them with different indices) as we proceed through the factorization. +* +* > As a quick aside regarding the name "twiddle", early FFT papers (notably Gentleman & Sande, 1966) described how you "twiddle" one branch of each butterfly by a complex rotation before adding/subtracting. The coefficients themselves inherited the nickname "twiddle factors," and the term stuck. +* +* By reusing the workspace array when computing multiple transforms of the same length `N`, every subsequent `*f` (forward) or `*b` (backward) call can simply look up the pre-stored twiddle factors instead of recomputing sine and cosine on-the-fly. +* +* In short, twiddle factors are cached roots of unity that allow each stage of the algorithm to rotate data quickly and predictably. +* +* @param {NonNegativeInteger} N - length of the sequence to transform +* @param {Float64Array} workspace - workspace array +* @param {integer} strideW - stride length for `workspace` +* @param {NonNegativeInteger} offsetW - starting index for `workspace` +* @returns {void} +* +* @example +* var Float64Array = require( '@stdlib/array/float64' ); +* +* var N = 8; +* var workspace = new Float64Array( ( 2*N ) + 34 ); +* +* rffti( N, workspace, 1, 0 ); +* +* var twiddleFactors = workspace.slice( N, 2*N ); +* // returns [ 0, ~0.707, ~0.707, 0, 0, 0, 0, 0 ] +* +* var factors = workspace.slice( 2*N, ( 2*N ) + 4 ); +* // returns [ 8, 2, 2, 4 ] +*/ +function rffti( N, workspace, strideW, offsetW ) { + var offsetT; + var offsetF; + + // When a sub-sequence is a single data point, the FFT is the identity, so no initialization necessary... + if ( N === 1 ) { + return; + } + // Resolve the starting indices for storing twiddle factors and factorization results: + offsetT = offsetW + ( N*strideW ); // index offset for twiddle factors + offsetF = offsetT + ( N*strideW ); // index offset for factorization results + + // Initialize a provided workspace array: + rffti1( N, workspace, strideW, offsetT, workspace, strideW, offsetF ); +} + + +// EXPORTS // + +module.exports = rffti; diff --git a/lib/node_modules/@stdlib/fft/base/fftpack/rffti/lib/rffti1.js b/lib/node_modules/@stdlib/fft/base/fftpack/rffti/lib/rffti1.js new file mode 100644 index 000000000000..18a9062cce13 --- /dev/null +++ b/lib/node_modules/@stdlib/fft/base/fftpack/rffti/lib/rffti1.js @@ -0,0 +1,185 @@ +/** +* @license Apache-2.0 +* +* Copyright (c) 2026 The Stdlib Authors. +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +* +* ## Notice +* +* The original C code and copyright notice are from the [PFFFT library]{@link https://github.com/marton78/pffft/blob/0b4ee12c4ba45a4a8e567550c16d96d1679f50ce/src/fftpack.c}. The implementation follows the original, but has been modified for JavaScript. +* +* ```text +* Copyright (c) 2004 the University Corporation for Atmospheric +* Research ("UCAR"). All rights reserved. Developed by NCAR's +* Computational and Information Systems Laboratory, UCAR, +* www.cisl.ucar.edu. +* +* Redistribution and use of the Software in source and binary forms, +* with or without modification, is permitted provided that the +* following conditions are met: +* +* - Neither the names of NCAR's Computational and Information Systems +* Laboratory, the University Corporation for Atmospheric Research, +* nor the names of its sponsors or contributors may be used to +* endorse or promote products derived from this Software without +* specific prior written permission. +* +* - Redistributions of source code must retain the above copyright +* notices, this list of conditions, and the disclaimer below. +* +* - Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions, and the disclaimer below in the +* documentation and/or other materials provided with the +* distribution. +* +* THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +* EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO THE WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +* NONINFRINGEMENT. IN NO EVENT SHALL THE CONTRIBUTORS OR COPYRIGHT +* HOLDERS BE LIABLE FOR ANY CLAIM, INDIRECT, INCIDENTAL, SPECIAL, +* EXEMPLARY, OR CONSEQUENTIAL DAMAGES OR OTHER LIABILITY, WHETHER IN AN +* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE +* SOFTWARE. +* ``` +*/ + +'use strict'; + +// MODULES // + +var TWO_PI = require( '@stdlib/constants/float64/two-pi' ); +var floor = require( '@stdlib/math/base/special/floor' ); +var sin = require( '@stdlib/math/base/special/sin' ); +var cos = require( '@stdlib/math/base/special/cos' ); +var decompose = require( '@stdlib/fft/base/fftpack/decompose' ); + + +// VARIABLES // + +var TRIAL_FACTORS = [ 4, 2, 3, 5 ]; + + +// MAIN // + +/** +* Initializes the working arrays for applying a Fourier transform to a real-valued sequence. +* +* @private +* @param {NonNegativeInteger} n - length of the sequence +* @param {Collection} wa - array of twiddle factors +* @param {integer} strideW - stride length for `wa` +* @param {NonNegativeInteger} offsetW - starting index for `wa` +* @param {Collection} ifac - array containing a radix factorization +* @param {integer} strideF - stride length for `ifac` +* @param {NonNegativeInteger} offsetF - starting index for `ifac` +* @returns {void} +*/ +function rffti1( n, wa, strideW, offsetW, ifac, strideF, offsetF ) { + var argld; + var argh; + var nfm1; + var arg; + var ipm; + var ido; + var nf; + var fi; + var ip; + var l2; + var l1; + var ld; + var ii; + var is; + var k1; + var i; + var j; + + // Decompose the sequence length into its radix factors: + nf = decompose( n, 4, TRIAL_FACTORS, 1, 0, ifac, strideF, offsetF ); + + // Compute the master angular step (i.e., the basic angle that generates all twiddles): + argh = TWO_PI / n; + + // Initialize the index into the twiddle factor array: + is = 0; + + // Compute the number of factors minus one: + nfm1 = nf - 1; + + // Initialize a running product of factors already processed: + l1 = 1; + + // If the number of radix factors is `1`, the only twiddle factor we need is `W_N^0 = 1`, which the main transform kernels already hard-code, so nothing to pre-compute... + if ( nfm1 === 0 ) { + return; + } + // Generate twiddle factors for each radix factor... + for ( k1 = 0; k1 < nfm1; k1++ ) { + // Resolve the next radix factor (C code: ifac[k1+2] with 1-based, JS: ifac[k1+2] with 0-based): + ip = ifac[ offsetF + ((k1+2)*strideF) ]; + + // Initialize a running offset used to step the angle: + ld = 0; + + // Compute the length of the transform after including the current radix: + l2 = l1 * ip; + + // Compute the number of data points in each sub-transform: + ido = floor( n / l2 ); + + // Compute the number of iterations for the inner loop: + ipm = ip - 1; + + // Iterate over each butterfly column within the current radix... + for ( j = 0; j < ipm; j++ ) { + // Advance to the next column: + ld += l1; + + // Initialize the index into the twiddle factor array: + i = is; + + // Compute the angle step for this column: + argld = ld * argh; + + // Initialize the harmonic counter: + fi = 0.0; + + // Iterate over each non-trivial harmonic in the column... + for ( ii = 2; ii < ido; ii += 2 ) { + // Advance the index by 2 (for cosine and sine): + i += 2; + + // Update the harmonic counter: + fi += 1.0; + + // Compute the angle for this harmonic: + arg = fi * argld; + + // Store the cosine and sine values: + wa[ offsetW + ( ( i-1 ) * strideW ) ] = cos( arg ); + wa[ offsetW + ( i*strideW ) ] = sin( arg ); + } + // Advance the index by the number of data points in each sub-transform: + is += ido; + } + // Update the running product of factors already processed: + l1 = l2; + } +} + + +// EXPORTS // + +module.exports = rffti1; diff --git a/lib/node_modules/@stdlib/fft/base/fftpack/rffti/package.json b/lib/node_modules/@stdlib/fft/base/fftpack/rffti/package.json new file mode 100644 index 000000000000..ea78bb766695 --- /dev/null +++ b/lib/node_modules/@stdlib/fft/base/fftpack/rffti/package.json @@ -0,0 +1,64 @@ +{ + "name": "@stdlib/fft/base/fftpack/rffti", + "version": "0.0.0", + "description": "Initialize a workspace array for performing a real-valued Fourier transform.", + "license": "Apache-2.0", + "author": { + "name": "The Stdlib Authors", + "url": "https://github.com/stdlib-js/stdlib/graphs/contributors" + }, + "contributors": [ + { + "name": "The Stdlib Authors", + "url": "https://github.com/stdlib-js/stdlib/graphs/contributors" + } + ], + "main": "./lib", + "directories": { + "benchmark": "./benchmark", + "doc": "./docs", + "example": "./examples", + "lib": "./lib", + "test": "./test" + }, + "types": "./docs/types", + "scripts": {}, + "homepage": "https://github.com/stdlib-js/stdlib", + "repository": { + "type": "git", + "url": "git://github.com/stdlib-js/stdlib.git" + }, + "bugs": { + "url": "https://github.com/stdlib-js/stdlib/issues" + }, + "dependencies": {}, + "devDependencies": {}, + "engines": { + "node": ">=0.10.0", + "npm": ">2.7.0" + }, + "os": [ + "aix", + "darwin", + "freebsd", + "linux", + "macos", + "openbsd", + "sunos", + "win32", + "windows" + ], + "keywords": [ + "stdlib", + "fft", + "fftpack", + "rffti", + "fourier", + "transform", + "twiddle", + "workspace", + "initialization", + "real" + ], + "__stdlib__": {} +} diff --git a/lib/node_modules/@stdlib/fft/base/fftpack/rffti/test/fixtures/c/fftpack/Makefile b/lib/node_modules/@stdlib/fft/base/fftpack/rffti/test/fixtures/c/fftpack/Makefile new file mode 100644 index 000000000000..7ce16281940d --- /dev/null +++ b/lib/node_modules/@stdlib/fft/base/fftpack/rffti/test/fixtures/c/fftpack/Makefile @@ -0,0 +1,137 @@ +#/ +# @license Apache-2.0 +# +# Copyright (c) 2026 The Stdlib Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#/ + +# VARIABLES # + +ifndef VERBOSE + QUIET := @ +endif + +# Specify the path to FFTPACK: +FFTPACK ?= + +# Specify a list of FFTPACK source files: +FFTPACK_SRC ?= + +# Determine the OS: +# +# [1]: https://en.wikipedia.org/wiki/Uname#Examples +# [2]: http://stackoverflow.com/a/27776822/2225624 +OS ?= $(shell uname) +ifneq (, $(findstring MINGW,$(OS))) + OS := WINNT +else +ifneq (, $(findstring MSYS,$(OS))) + OS := WINNT +else +ifneq (, $(findstring CYGWIN,$(OS))) + OS := WINNT +endif +endif +endif + +# Define the program used for compiling C source files: +ifdef C_COMPILER + CC := $(C_COMPILER) +else + CC := gcc +endif + +# Define the command-line options when compiling C files: +CFLAGS ?= \ + -std=c99 \ + -O3 \ + -Wall \ + -pedantic + +# Determine whether to generate [position independent code][1]: +# +# [1]: https://gcc.gnu.org/onlinedocs/gcc/Code-Gen-Options.html#Code-Gen-Options +# [2]: http://stackoverflow.com/questions/5311515/gcc-fpic-option +ifeq ($(OS), WINNT) + fPIC ?= +else + fPIC ?= -fPIC +endif + +# List of C targets: +c_targets := runner.out + + +# RULES # + +#/ +# Compiles C source files. +# +# @param {string} [C_COMPILER] - C compiler +# @param {string} [CFLAGS] - C compiler flags +# @param {(string|void)} [fPIC] - flag indicating whether to generate position independent code +# +# @example +# make +# +# @example +# make all +#/ +all: $(c_targets) + +.PHONY: all + +#/ +# Compiles C source files. +# +# @private +# @param {string} CC - C compiler +# @param {string} CFLAGS - C compiler flags +# @param {(string|void)} fPIC - flag indicating whether to generate position independent code +#/ +$(c_targets): %.out: %.c + $(QUIET) $(CC) $(CFLAGS) -DFFTPACK_DOUBLE_PRECISION $(fPIC) -o $@ $(FFTPACK_SRC) $< -lm + +#/ +# Generates test fixtures. +# +# @example +# make run +#/ +run: $(c_targets) + $(QUIET) ./$< + +.PHONY: run + +#/ +# Removes generated files. +# +# @example +# make clean +#/ +clean: + $(QUIET) -rm -f *.o *.out + +.PHONY: clean + +#/ +# Removes generated test fixtures. +# +# @example +# make clean-fixtures +#/ +clean-fixtures: + $(QUIET) -rm -f *.json + +.PHONY: clean-fixtures diff --git a/lib/node_modules/@stdlib/fft/base/fftpack/rffti/test/fixtures/c/fftpack/large.json b/lib/node_modules/@stdlib/fft/base/fftpack/rffti/test/fixtures/c/fftpack/large.json new file mode 100644 index 000000000000..37ea1b0c0505 --- /dev/null +++ b/lib/node_modules/@stdlib/fft/base/fftpack/rffti/test/fixtures/c/fftpack/large.json @@ -0,0 +1 @@ +{"lengths":[502,743,655,961,886,600,210,713,500,756],"offsets":[0,501,1243,1897,2857,3742,4341,4550,5262,5761],"twiddles":[0.9999216720722226,0.012515978598993244,0.99968670055941911,0.025029996496650959,0.99929512227125272,0.037540093298792959,0.99874699855075533,0.050044309225501633,0.99804241526471715,0.062540685418132944,0.99718148279023588,0.075027264246183084,0.99616433599742471,0.08750208961396283,0.99499113422828478,0.099963207267031257,0.99366206127174295,0.11240866509834127,0.99217732533486025,0.12483651345404856,0.99053715901021533,0.13724480543893622,0.9887418192394668,0.1496315972214074,0.98679158727310268,0.16199494833799785,0.98468676862638005,0.17433292199736086,0.98242769303146482,0.18664358538367701,0.98001471438577714,0.1989250099594411,0.97744821069655108,0.21117527176757875,0.97472858402161788,0.22339245173284561,0.97185626040642126,0.23557463596246184,0.9688316898172743,0.24771991604593438,0.96565534607087056,0.2598263893540208,0.96232772676005707,0.27189215933678729,0.95884935317588393,0.28391533582071415,0.95522077022594098,0.29589403530480296,0.95144254634899461,0.3078263812556376,0.94751527342593878,0.31971050440135429,0.94343956668707329,0.33154454302447417,0.93921606461572416,0.34332664325355206,0.93484542884822197,0.35505495935359627,0.93032834407025211,0.36672765401521407,0.92566551790959517,0.37834289864243648,0.92085768082527253,0.38989887363917902,0.91590558599311611,0.40139376869429183,0.91081000918777855,0.41282578306515549,0.90557174866120382,0.42419312585977798,0.90019162501757644,0.43549401631734846,0.89467048108476877,0.44672668408720384,0.88900918178230715,0.45788936950616438,0.88320861398587747,0.46898032387419553,0.87726968638839042,0.47999780972835188,0.87119332935763005,0.49094010111496078,0.86498049479050554,0.50180548386000345,0.8586321559639315,0.51259225583764989,0.85214930738235817,0.5232987272369074,0.84553296462197658,0.53392322082633881,0.83878416417162216,0.54446407221681126,0.83190396327040383,0.55491963012223178,0.82489343974207996,0.56528825661823134,0.81775369182621194,0.57556832739875541,0.81048583800611773,0.58575823203052058,0.80309101683365569,0.5958563742052988,0.79557038675086322,0.60586117198998812,0.78792512590848029,0.615771058074432,0.78015643198138518,0.62558448001694733,0.77226552198097143,0.63529990048752383,0.76425363206449637,0.64491579750865569,0.75612201734142948,0.65443066469376809,0.74787195167683218,0.66384301148320146,0.73950472749179963,0.67315136337771708,0.73102165556099497,0.68235426216948492,0.72242406480730936,0.69145026617052108,0.71371330209367811,0.70043795043853685,0.70489073201208652,0.70931590700016367,0.69595773666979899,0.71808274507152081,0.68691571547284358,0.72673709127608965,0.67776608490678669,0.73527758985986136,0.66851027831483278,0.74370290290372321,0.65914974567328244,0.75201171053305227,0.64968595336438484,0.76020271112448046,0.64012038394662107,0.76827462150980252,0.63045453592245226,0.77622617717699094,0.62068992350357011,0.78405613246828976,0.61082807637368719,0.79176326077535386,0.60087053944890312,0.79934635473140436,0.59081887263568411,0.80680422640036986,0.58067465058649448,0.81413570746298347,0.57043946245311827,0.82133964939980675,0.56011491163770932,0.82841492367115233,0.54970261554160871,0.83536042189387583,0.53920420531196989,0.84217505601501108,0.52862132558622921,0.84885775848221934,0.51795563423446411,0.85540748241102849,0.50720880209967889,0.86182320174883242,0.49638251273605571,0.86810391143562959,0.48547846214521756,0.87424862756147037,0.47449835851053851,0.88025638752059299,0.46344392192954786,0.88612625016222102,0.45231688414446553,0.89185729593800045,0.44111898827091589,0.89744862704605188,0.42985198852485718,0.90289936757161704,0.41851764994777407,0.90820866362427555,0.40711774813017382,0.91337568347171161,0.39565406893342853,0.91839961767001066,0.38412840821001093,0.92327967919046239,0.37254257152216214,0.92801510354285432,0.36089837385904117,0.93260514889523305,0.34919763935239484,0.93704909619011678,0.33744220099079825,0.94134624925714006,0.32563390033250494,0.94549593492211281,0.31377458721695767,0.94949750311247672,0.30186611947499836,0.95335032695914357,0.28991036263782993,0.95705380289469721,0.2779091896447683,0.96060735074794645,0.26586448054983614,0.96401041383481212,0.25377812222724205,0.96726245904553487,0.24165200807578915,0.97036297692818985,0.22948803772226484,0.97331148176849547,0.21728811672385134,0.97610751166590348,0.20505415626961082,0.97875062860595807,0.1927880728810846,0.98124041852891364,0.18049178811206068,0.98357649139459968,0.16816722824754926,0.98575848124352283,0.15581632400202064,0.9877860462541963,0.14344101021694589,0.98965886879668896,0.13104322555769418,0.99137665548238285,0.11862491220982808,0.99293913720993521,0.10618801557484943,0.99434606920743418,0.09373448396544147,0.99559723107074394,0.081266268300252686,0.99669242679803249,0.068785321798275817,0.99763148482047603,0.056293599672862807,0.99841425802913664,0.043793058825431011,0.99904062379800773,0.031285657538901342,0.99951048400322373,0.018773355170923541,0.99982376503843229,0.0062581118469295857,0.99998041782632485,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.99995399089228465,0.0095925022070750422,0.99981596780281456,0.019184121729215471,0.99958594343222806,0.028773975962709773,0.99926393894695731,0.038361182466285143,0.99884998397728031,0.047944859042308149,0.99834411661459477,0.057524123817963006,0.99774638340791266,0.067098095326399917,0.99705683935957679,0.076665892587846091,0.99627554792020001,0.086226635190671932,0.99540258098282641,0.095779443372404918,0.99443801887631555,0.10532343810068384,0.99338195035795129,0.1148577411541457,0.99223447260527398,0.12438147520323815,0.99099569120713871,0.13389376389094976,0.98966572015399901,0.14339373191345081,0.98824468182741765,0.15288050510063725,0.98673270698880577,0.16235321049657017,0.98512993476738953,0.17181097643980375,0.98343651264740872,0.18125293264359393,0.9816525964545445,0.19067821027598067,0.97977835034158178,0.20008594203973626,0.9778139467733028,0.20947526225217258,0.97575956651061857,0.21884530692479959,0.97361539859393453,0.22819521384282795,0.97138164032575602,0.2375241226445087,0.96905849725253246,0.24683117490030193,0.9666461831457438,0.25611551419186823,0.96414491998222918,0.26537628619087439,0.96155493792376112,0.27461263873760766,0.95887647529586684,0.28382372191938954,0.95610977856589718,0.29300868814878356,0.95325510232034805,0.30216669224158832,0.95031270924143318,0.31129689149461048,0.94728287008291279,0.32039844576320814,0.94416586364517918,0.32947051753859991,0.94096197674960236,0.33851227202493073,0.93767150421213696,0.34752287721608843,0.93429474881619357,0.35650150397226332,0.93083202128477793,0.36544732609624431,0.9272836402518978,0.37435952040944409,0.92364993223324365,0.38323726682764614,0.91993123159614254,0.39207974843646826,0.91612788052879113,0.40088615156653268,0.912240229008767,0.40965566586833907,0.90826863477082542,0.41838748438683115,0.90421346327398056,0.42708080363565143,0.90007508766787669,0.43573482367107641,0.89585388875845207,0.44434874816562614,0.89155025497289708,0.45292178448134085,0.88716458232391282,0.46145314374271779,0.88269727437326961,0.46994204090930269,0.87814874219467309,0.47838769484792726,0.87351940433593711,0.48678932840458788,0.86880968678046988,0.49514616847595799,0.86402002290807633,0.50345744608052745,0.85915085345507824,0.51172239642936346,0.85420262647375944,0.51994025899648399,0.84917579729113635,0.52811027758884121,0.84407082846705961,0.53623170041590384,0.83888818975165003,0.54430378015883696,0.83362835804207369,0.55232577403926764,0.82829181733865787,0.56029694388763485,0.8228790587003546,0.56821655621111422,0.81739058019955446,0.57608388226111285,0.81182688687625448,0.58389819810032739,0,0.99981596780281456,0.019184121729215471,0.99926393894695731,0.038361182466285143,0.99834411661459477,0.057524123817963006,0.99705683935957679,0.076665892587846091,0.99540258098282641,0.095779443372404918,0.99338195035795129,0.1148577411541457,0.99099569120713871,0.13389376389094976,0.98824468182741765,0.15288050510063725,0.98512993476738953,0.17181097643980375,0.9816525964545445,0.19067821027598067,0.9778139467733028,0.20947526225217258,0.97361539859393453,0.22819521384282795,0.96905849725253246,0.24683117490030193,0.96414491998222918,0.26537628619087439,0.95887647529586684,0.28382372191938954,0.95325510232034805,0.30216669224158832,0.94728287008291279,0.32039844576320814,0.94096197674960236,0.33851227202493073,0.93429474881619357,0.35650150397226332,0.9272836402518978,0.37435952040944409,0.91993123159614254,0.39207974843646826,0.912240229008767,0.40965566586833907,0.90421346327398056,0.42708080363565143,0.89585388875845207,0.44434874816562614,0.88716458232391282,0.46145314374271779,0.87814874219467309,0.47838769484792726,0.86880968678046988,0.49514616847595799,0.85915085345507824,0.51172239642936346,0.84917579729113635,0.52811027758884121,0.83888818975165003,0.54430378015883696,0.82829181733865787,0.56029694388763485,0.81739058019955446,0.57608388226111285,0.80618849069158549,0.59165878466935951,0.79468967190504114,0.60701591854535253,0.78289835614569425,0.62214963147491265,0.77081888337703852,0.63705435327715598,0.75845569962290305,0.65172459805467875,0.74581335533102855,0.66615496621272208,0.73289650369821047,0.68034014644656893,0.71970989895762205,0.69427491769644789,0.70625839462895112,0.70795415106921777,0.69254694173199149,0.7213728117261321,0.67858058696434997,0.73452596073598264,0.66436447084393546,0.74740875689294517,0.64990382581691819,0.76001645849845434,0.63520397433185227,0.7723444251064544,0.62027032688067185,0.78438811923138185,0.60510838000728195,0.7961431080182525,0.58972371428447568,0.807605064874238,0.57412199225992522,0.81876977106112947,0.55830895637199851,0.82963311724810618,0.5422904268361729,0.84019110502423278,0.52607229950282064,0.85043984837013287,0.50966054368715641,0.86037557508829365,0.49306119997214548,0.86999462819147788,0.4762803779851788,0.87929346724873103,0.4593242541493382,0.88826866968848683,0.44219906941007425,0.89691693205829515,0.42491112693813671,0.90523507124070413,0.40746678980960094,0.91322002562485372,0.38987247866384761,0.92086885623334425,0.372134669340353,0.92817874780397025,0.35425989049516343,0.93514700982591759,0.3362547211979286,0.94177107753004563,0.3181257885103817,0.9480485128328866,0,0.99958594343222806,0.028773975962709773,0.99834411661459477,0.057524123817963006,0.99627554792020001,0.086226635190671919,0.99338195035795129,0.1148577411541457,0.98966572015399901,0.14339373191345081,0.98512993476738953,0.17181097643980373,0.97977835034158178,0.20008594203973623,0.97361539859393453,0.22819521384282795,0.96664618314574391,0.25611551419186818,0.95887647529586684,0.28382372191938954,0.95031270924143318,0.31129689149461048,0.94096197674960247,0.33851227202493073,0.93083202128477793,0.36544732609624431,0.91993123159614265,0.3920797484364682,0.90826863477082542,0.41838748438683115,0.89585388875845207,0.44434874816562614,0.88269727437326961,0.46994204090930269,0.86880968678046999,0.49514616847595788,0.85420262647375944,0.51994025899648399,0.83888818975165003,0.54430378015883696,0.8228790587003546,0.56821655621111422,0.80618849069158549,0.59165878466935951,0.78883030740395021,0.61461105271626004,0.77081888337703863,0.63705435327715587,0.75216913410767716,0.65897010076004747,0.73289650369821047,0.68034014644656893,0.71301695206703719,0.70114679352118014,0.69254694173199161,0.72137281172613199,0.67150342417751696,0.74100145163006914,0.64990382581691819,0.76001645849845434,0.62776603356132032,0.77840208575432746,0.60510838000728195,0.7961431080182525,0.58194962825533181,0.81322483371665499,0.55830895637199862,0.82963311724810607,0.53420594150820189,0.84535437069748187,0.50966054368715663,0.86037557508829354,0.48469308927521559,0.87468429116387347,0.4593242541493382,0.88826866968848683,0.43357504657512602,0.90111746125983894,0.40746678980960094,0.91322002562485372,0.38102110444313658,0.92456634049100683,0.35425989049516343,0.93514700982591759,0.32720530927847485,0.94495327163832687,0.29987976504715314,0.95397700523401729,0.272305886443312,0.96221073794066658,0.24450650775802121,0.96964765129606578,0.21650465002193006,0.97628158669457732,0.18832350194124939,0.98210705048715752,0.15998640069487935,0.98711921853071904,0.13151681260858569,0.9913139401830674,0.10293831372222599,0.99468774174010233,0.074274570266122178,0.99723782931243787,0.045549319062744113,0.99896209113905832,0.01678634786993511,0.99985909933609618,-0.011990524318042799,0.9999281110792807,-0.040757466995330872,0.99916906921908089,-0.069490657878828618,0.99758260232803153,-0.098166302635739319,0.99517002418020428,-0.12676065458796981,0.99193333266325379,-0.15525003437706564,0.98787520812394114,-0.18361084957340015,0.98299901114850274,-0.21181961421337459,0.97730877977970565,-0.23985296824845306,0.97080922617289056,-0.26768769688992577,0.96350573269377449,-0.2953007498333805,0.95540434746124281,0,0.99926393894695731,0.038361182466285143,0.99705683935957679,0.076665892587846091,0.99338195035795129,0.1148577411541457,0.98824468182741765,0.15288050510063725,0.9816525964545445,0.19067821027598067,0.97361539859393453,0.22819521384282795,0.96414491998222918,0.26537628619087439,0.95325510232034805,0.30216669224158832,0.94096197674960236,0.33851227202493073,0.9272836402518978,0.37435952040944409,0.912240229008767,0.40965566586833907,0.89585388875845207,0.44434874816562614,0.87814874219467309,0.47838769484792726,0.85915085345507824,0.51172239642936346,0.83888818975165003,0.54430378015883696,0.81739058019955446,0.57608388226111285,0.79468967190504114,0.60701591854535253,0.77081888337703852,0.63705435327715598,0.74581335533102855,0.66615496621272208,0.71970989895762205,0.69427491769644789,0.69254694173199149,0.7213728117261321,0.66436447084393546,0.74740875689294517,0.63520397433185227,0.7723444251064544,0.60510838000728195,0.7961431080182525,0.57412199225992522,0.81876977106112947,0.5422904268361729,0.84019110502423278,0.50966054368715641,0.86037557508829365,0.4762803779851788,0.87929346724873103,0.44219906941007425,0.89691693205829515,0.40746678980960094,0.91322002562485372,0.372134669340353,0.92817874780397025,0.3362547211979286,0.94177107753004563,0.29987976504715314,0.95397700523401729,0.26306334926508379,0.96477856229988679,0.22585967211126068,0.97415984751671725,0.18832350194124917,0.98210705048715763,0.15051009658093475,0.98860847195803336,0.11247512198025425,0.99365454104307649,0.074274570266122178,0.99723782931243787,0.035964677315181139,0.99935306172824367,-0.0023981600322735895,0.99999712441009525,-0.040757466995331094,0.99916906921908089,-0.079056773990236515,0.99687011515355228,-0.11723969976051532,0.99310364655461025,-0.15525003437706564,0.98787520812394114,-0.19303182198603916,0.98119249676133891,-0.23052944318268886,0.97306535023392926,-0.26768769688992577,0.96350573269377449,-0.3044518816210442,0.95252771706518113,-0.34076787600698871,0.94014746432763707,-0.37658221846961976,0.92638319972487604,-0.41184218592368282,0.91125518593509403,-0.44649587139162922,0.89478569324181179,-0.4804922604170242,0.87699896674929934,-0.51378130616405593,0.8579211906908214,-0.54631400309259037,0.83758044988224811,-0.57804245910030827,0.81600668837777823,-0.60891996602572862,0.79323166538863377,-0.63890106840832539,0.76928890852962406,-0.66794163040451704,0.74421366446240123,-0.69599890076101534,0.71804284700807253,-0.72303157574989219,0.69081498280554676,-0.74899985997270968,0.66257015459561819,-0.77386552494420657,0.63334994221427665,-0.79759196536929577,0.60319736138211355,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.99997862621587907,0.0065381275150541273,0.99991450577719376,0.013075975541056132,0.99980764142493683,0.019613264600901365,0.99965803772729944,0.026149715241379632,0.99946570107947585,0.032685048045121116,0.9992306397033901,0.039218983642540797,0.99895286364734437,0.045751242723780859,0.99863238478558947,0.052281546050650433,0.99826921681781766,0.058809614468562421,0.99786337526857627,0.065335168918466649,0.99741487748660462,0.071857930448778959,0.99692374264409223,0.078377620227305669,0.9963899917358594,0.084893959553163104,0.99581364757845936,0.091406669868691226,0.99519473480920351,0.097915472771361381,0,0.99991450577719376,0.013075975541056132,0.99965803772729944,0.026149715241379632,0.9992306397033901,0.039218983642540797,0.99863238478558947,0.052281546050650433,0.99786337526857627,0.065335168918466649,0.99692374264409223,0.078377620227305669,0.99581364757845936,0.091406669868691226,0.99453327988510742,0.10442009002567733,0.99308285849211808,0.11741565555377921,0.99146263140479085,0.13039114436144741,0.98967287566323692,0.14334433779001962,0.98771389729500847,0.15627302099308574,0.98558603126277178,0.16917498331520114,0.98328964140703223,0.18204801866988293,0.98082512038392156,0.19488992591682555,0,0.99980764142493683,0.019613264600901365,0.9992306397033901,0.039218983642540797,0.99826921681781766,0.058809614468562421,0.99692374264409223,0.078377620227305669,0.99519473480920351,0.097915472771361381,0.99308285849211808,0.11741565555377921,0.99058892616787431,0.1368706665198122,0.98771389729500847,0.15627302099308574,0.98445887794643516,0.17561525455508123,0.98082512038392156,0.19488992591682555,0.97681402257632155,0.21408961978168281,0.97242712766175254,0.23320694969814601,0.96766612335392388,0.25223456090153173,0.96253284129284478,0.27116513314348395,0.95702925634016034,0.28999138350819958,0,0.99965803772729944,0.026149715241379632,0.99863238478558947,0.052281546050650433,0.99692374264409223,0.078377620227305669,0.99453327988510742,0.10442009002567733,0.99146263140479085,0.13039114436144741,0.98771389729500847,0.15627302099308574,0.98328964140703223,0.18204801866988293,0.97819288959805883,0.20769850923827013,0.97242712766175254,0.23320694969814601,0.96599629894422434,0.2585558942009652,0.95890480164708147,0.28372800598138226,0.95115748581938919,0.30870606921429078,0.9427596500406028,0.33347300078914943,0.93371703779673987,0.35801186199353979,0.92403583355226848,0.38230587009796796,0,0.99946570107947585,0.032685048045121116,0.99786337526857627,0.065335168918466649,0.99519473480920351,0.097915472771361381,0.99146263140479085,0.13039114436144741,0.98667105317297898,0.16272748025617698,0.98082512038392156,0.19488992591682555,0.97393107998877593,0.22684411262339732,0.96599629894422434,0.2585558942009652,0.95702925634016034,0.28999138350819964,0.94703953433895105,0.3211169886490946,0.93603780793595981,0.35189944886919516,0.92403583355226848,0.38230587009796796,0.91104643647179195,0.41230376009933395,0.89708349713620683,0.44186106319280177,0.88216193631234185,0.47094619450809838,0,0.9992306397033901,0.039218983642540797,0.99692374264409223,0.078377620227305669,0.99308285849211808,0.11741565555377921,0.98771389729500847,0.15627302099308574,0.98082512038392156,0.19488992591682555,0.97242712766175254,0.23320694969814601,0.96253284129284478,0.27116513314348395,0.95115748581938919,0.30870606921429078,0.93831856473510811,0.34577199289914567,0.92403583355226848,0.38230587009796796,0.90833126940346898,0.41825148538156159,0.89122903722497282,0.45355352849145386,0.87275545257362297,0.48815767944692884,0.85293894113455326,0.52201069212830031,0.83180999498200059,0.55506047620781296,0,0.99895286364734437,0.045751242723780859,0.99581364757845936,0.091406669868691226,0.99058892616787431,0.13687066651981222,0.98328964140703223,0.18204801866988293,0.97393107998877593,0.22684411262339732,0.96253284129284467,0.27116513314348401,0.94911879633942808,0.31491825992659611,0.93371703779673987,0.35801186199353979,0.91635982114730974,0.40035568958973272,0.89708349713620683,0.44186106319280177,0.87592843564266631,0.48244105923168623,0.85293894113455315,0.52201069212830042,0.82816315988272482,0.56048709228050941,0.80165297912960964,0.59778967961367613,0.77346391842317186,0.63384033233731107,0,0.99863238478558947,0.052281546050650433,0.99453327988510742,0.10442009002567733,0.98771389729500847,0.15627302099308574,0.97819288959805883,0.20769850923827013,0.96599629894422434,0.2585558942009652,0.95115748581938919,0.30870606921429078,0.93371703779673987,0.35801186199353979,0.91372265852040047,0.40633840983398517,0.89122903722497282,0.45355352849145386,0.86629769914787857,0.49952807373669372,0.83899683724365748,0.54413629459459856,0.80940112566052302,0.58725617730210233,0.7775915154893599,0.62876977904393638,0.74365501334383721,0.66856355055340644,0.70768444337727132,0.70652864669580218,0,0.99826921681781766,0.058809614468562421,0.99308285849211808,0.11741565555377921,0.98445887794643516,0.17561525455508123,0.97242712766175254,0.23320694969814601,0.95702925634016034,0.28999138350819958,0.93831856473510811,0.34577199289914567,0.91635982114730974,0.40035568958973272,0.89122903722497282,0.45355352849145386,0.86301320484443267,0.50518136175451012,0.83180999498200059,0.55506047620781296,0.79772741961939642,0.60301821198648675,0.76088345785310629,0.64888856020544872,0.72140564750191039,0.69251273761018239,0.67943064362625916,0.7337397362155107,0.63510374548771265,0.77242684602975753,0,0.99786337526857627,0.065335168918466649,0.99146263140479085,0.13039114436144741,0.98082512038392156,0.19488992591682555,0.96599629894422434,0.2585558942009652,0.94703953433895105,0.3211169886490946,0.92403583355226848,0.38230587009796796,0.89708349713620683,0.44186106319280177,0.86629769914787857,0.49952807373669372,0.83180999498200059,0.55506047620781307,0.79376775920187448,0.60822096679712956,0.75233355577111349,0.65878237746678758,0.70768444337727132,0.70652864669580218,0.66001121881590175,0.75125574276483764,0.60951760166825375,0.79277253563464223,0.55641936375668077,0.83090161369238569,0,0.99741487748660462,0.071857930448778959,0.98967287566323692,0.14334433779001962,0.97681402257632155,0.21408961978168284,0.95890480164708147,0.28372800598138226,0.93603780793595981,0.35189944886919516,0.90833126940346898,0.41825148538156165,0.8759284356426662,0.48244105923168634,0.83899683724365748,0.54413629459459856,0.79772741961939642,0.60301821198648675,0.75233355577111349,0.65878237746678758,0.70304994309761693,0.71114047663625324,0.65013138995223463,0.75982180529304066,0.5938514982211911,0.8045746690397646,0.53450124873481708,0.84516768460520375,0.47238749682535847,0.88139097615250861,0,0.99692374264409223,0.078377620227305669,0.98771389729500847,0.15627302099308574,0.97242712766175254,0.23320694969814601,0.95115748581938919,0.30870606921429078,0.92403583355226848,0.38230587009796796,0.89122903722497282,0.45355352849145386,0.85293894113455326,0.52201069212830031,0.80940112566052302,0.58725617730210233,0.76088345785310629,0.64888856020544872,0.70768444337727132,0.70652864669580218,0.65013138995223474,0.75982180529304066,0.58857839358590391,0.80844014905485539,0.52340415999397893,0.85208455290598795,0.45500967460746577,0.8904864940096554,0.38381573550391179,0.9234097038582556,0,0.9963899917358594,0.084893959553163104,0.98558603126277178,0.16917498331520114,0.96766612335392388,0.25223456090153173,0.9427596500406028,0.33347300078914943,0.91104643647179195,0.41230376009933395,0.87275545257362297,0.48815767944692884,0.82816315988272493,0.56048709228050941,0.7775915154893599,0.62876977904393638,0.72140564750191039,0.6925127376101825,0.66001121881590175,0.75125574276483764,0.5938514982211911,0.8045746690397646,0.52340415999397893,0.85208455290598795,0.44917783508063902,0.89344237221673695,0.37170843877387955,0.9283495228330142,0.29155530139547081,0.95655397455041513,0,0.99581364757845936,0.091406669868691226,0.98328964140703223,0.18204801866988293,0.96253284129284467,0.27116513314348401,0.93371703779673987,0.35801186199353979,0.89708349713620683,0.44186106319280177,0.85293894113455315,0.52201069212830042,0.80165297912960964,0.59778967961367613,0.74365501334383721,0.66856355055340644,0.67943064362625916,0.7337397362155107,0.60951760166825375,0.79277253563464223,0.53450124873481719,0.84516768460520364,0.45500967460746555,0.89048649400965552,0.37170843877387932,0.9283495228330142,0.28529499789475687,0.95843975511047674,0.19649286620505416,0.98050525420852419,0,0.99519473480920351,0.097915472771361381,0.98082512038392156,0.19488992591682555,0.95702925634016034,0.28999138350819958,0.92403583355226848,0.38230587009796796,0.88216193631234185,0.47094619450809838,0.83180999498200059,0.55506047620781296,0.77346391842317197,0.63384033233731096,0.70768444337727132,0.70652864669580218,0.63510374548771265,0.77242684602975753,0.55641936375668077,0.83090161369238569,0.47238749682535869,0.8813909761525085,0.38381573550391179,0.9234097038582556,0.29155530139547081,0.95655397455041513,0.19649286620505438,0.98050525420852419,0.099542030354207722,0.99503335833175055,0,0.99453327988510742,0.10442009002567733,0.97819288959805883,0.20769850923827013,0.95115748581938919,0.30870606921429078,0.91372265852040047,0.40633840983398517,0.86629769914787857,0.49952807373669372,0.80940112566052302,0.58725617730210233,0.74365501334383721,0.66856355055340644,0.66977819338717659,0.74256122418492188,0.58857839358590391,0.80844014905485539,0.5009434070978166,0.86548004187573913,0.40783138580972045,0.9130572603887025,0.31026036444104343,0.95065162191883468,0.20929712992207877,0.97785209076136892,0.10604555774284545,0.99436127221599335,0.0016345427963967241,0.99999866413403116,0,0.99382931108176087,0.11092024357506909,0.97539339913049472,0.22047157851446403,0.94491978870135218,0.32730199040120717,0.90278456613468105,0.43009304475777765,0.84950773813240066,0.52757615834415095,0.7857468141588162,0.61854825522288137,0.71228869186788868,0.70188661437381183,0.63003994570196853,0.77656272561838846,0.5400156385140662,0.84165498285238316,0.44332679429365474,0.89636005793504181,0.34116668659983052,0.94000281486519655,0.23479611192145836,0.97204464188974671,0.12552782971132748,0.99209009871481124,0.014710361125735968,0.99989179678380724,-0.096288653584619285,0.99535345239309903,0,0.99308285849211808,0.11741565555377921,0.97242712766175254,0.23320694969814601,0.93831856473510811,0.34577199289914567,0.89122903722497282,0.45355352849145386,0.83180999498200059,0.55506047620781296,0.76088345785310629,0.64888856020544872,0.67943064362625916,0.7337397362155107,0.58857839358590391,0.80844014905485539,0.4895835834717176,0.87195637207086896,0.38381573550391179,0.9234097038582556,0.27273807202524109,0.96208832446296444,0.15788727286899965,0.98745714290089071,0.040852216495301338,0.99916519975798845,-0.076748001003214439,0.9970505224621321,-0.19328646493495738,0.98114236605751948,0,0.99229395402521225,0.12390604829874093,0.96929458238998012,0.24590244518799312,0.93135635352472834,0.36410897098138251,0.87906397490113208,0.47670381583434152,0.81322338146680029,0.58195165764494827,0.7348493145017575,0.67823040699772308,0.64514968233253112,0.7640562069548511,0.5455069439379564,0.83810630239574702,0.43745680236427792,0.89923942644060095,0.32266453632859388,0.94651338976046906,0.20289933479014663,0.97919960168584419,0.080007030047405739,0.99679429931304964,-0.044118350399038012,0.99902631154442956,-0.16756377477246842,0.9858612384022416,-0.28842669084168737,0.95750198120427599,0,0.99146263140479085,0.13039114436144741,0.96599629894422434,0.2585558942009652,0.92403583355226848,0.38230587009796796,0.86629769914787857,0.49952807373669372,0.79376775920187448,0.60822096679712956,0.70768444337727132,0.70652864669580218,0.60951760166825375,0.79277253563464223,0.5009434070978166,0.86548004187573913,0.38381573550391157,0.9234097038582556,0.26013451109673014,0.96557238782831045,0.13201155827841407,0.99124817703787227,0.0016345427963967241,0.99999866413403116,-0.12877038207429581,0.9916744368493321,-0.25697658651315997,0.9664176291769746,-0.38079498327322114,0.92465949447023321,0,0.99058892616787431,0.1368706665198122,0.96253284129284478,0.27116513314348395,0.91635982114730974,0.40035568958973272,0.85293894113455326,0.52201069212830031,0.77346391842317197,0.63384033233731096,0.67943064362625916,0.7337397362155107,0.57260902492739563,0.81982858243153311,0.45500967460746577,0.8904864940096554,0.32884606500341118,0.94438353730450653,0.19649286620505438,0.98050525420852419,0.060441249664014055,0.99817175643225464,-0.076748001003214439,0.9970505224621321,-0.21249268946262409,0.97716265632950838,-0.3442378091433943,0.93888249038745841,-0.46950363394884903,0.88293053957195589,0,0.98967287566323692,0.14334433779001962,0.95890480164708147,0.28372800598138226,0.90833126940346898,0.41825148538156165,0.83899683724365748,0.54413629459459856,0.75233355577111349,0.65878237746678758,0.65013138995223463,0.75982180529304066,0.53450124873481708,0.84516768460520375,0.40783138580972045,0.9130572603887025,0.27273807202524109,0.96208832446296444,0.13201155827841407,0.99124817703787227,-0.011441555020875007,0.99993454326706022,-0.15465835159755087,0.98796801278236146,-0.29468079612089326,0.95559574528016633,-0.42861683020184249,0.90348636562359086,-0.55370010568614392,0.83271615389828546,0,0.98871451904981,0.1498118814383653,0.9551128003597944,0.29624236460856102,0.89995326704229262,0.43598637265389845,0.82448092282225682,0.56588974889297994,0.73039925110560977,0.68302044916998239,0.61983176572019194,0.78473472091158869,0.49527408116605859,0.86873677516559433,0.35953758419568033,0.9331306047658785,0.21568597811066673,0.97646277903791345,0.066966132031271081,0.99775524912714464,-0.083265204062817968,0.99652742350242285,-0.23161716440837804,0.97280701536914416,-0.37474130256060256,0.92712941715554631,-0.50940716905023276,0.86052561619060919,-0.63257522573545,0.77449892432833278,0,0.98771389729500847,0.15627302099308574,0.95115748581938919,0.30870606921429078,0.89122903722497282,0.45355352849145386,0.80940112566052302,0.58725617730210233,0.70768444337727132,0.70652864669580218,0.58857839358590391,0.80844014905485539,0.45500967460746577,0.8904864940096554,0.31026036444104343,0.95065162191883468,0.15788727286899965,0.98745714290089071,0.0016345427963967241,0.99999866413403116,-0.15465835159755065,0.98796801278236146,-0.30715094920767366,0.95166080848211099,-0.45209617060199464,0.89196919931520735,-0.58593239202721625,0.81035993976335263,-0.70537096235918251,0.7088383493156114,0,0.98667105317297898,0.16272748025617698,0.94703953433895105,0.3211169886490946,0.88216193631234185,0.47094619450809838,0.79376775920187448,0.60822096679712956,0.68421340558059629,0.72928184923512418,0.55641936375668077,0.83090161369238569,0.41379235370668971,0.91037129129486383,0.26013451109673014,0.96557238782831045,0.099542030354207722,0.99503335833175055,-0.063704031247604778,0.99796883538655867,-0.22525187755908466,0.97430056535758369,-0.38079498327322114,0.92465949447023321,-0.52618689681926745,0.85036894911309502,-0.65755177602775561,0.75340935874380022,-0.77138770991886918,0.6363654618111535,0,0.98558603126277178,0.16917498331520114,0.9427596500406028,0.33347300078914943,0.87275545257362297,0.48815767944692884,0.7775915154893599,0.62876977904393638,0.66001121881590175,0.75125574276483764,0.52340415999397893,0.85208455290598795,0.37170843877387955,0.9283495228330142,0.20929712992207877,0.97785209076136892,0.040852216495301116,0.99916519975798845,-0.12877038207429581,0.9916744368493321,-0.29468079612089326,0.95559574528016633,-0.45209617060199464,0.89196919931520735,-0.59647854494454045,0.80262902104324874,-0.7236656730885701,0.69015070353747143,-0.8299910124563924,0.55777676470216364,0,0.98445887794643516,0.17561525455508123,0.93831856473510811,0.34577199289914567,0.86301320484443267,0.50518136175451012,0.76088345785310629,0.64888856020544872,0.63510374548771265,0.77242684602975753,0.4895835834717176,0.87195637207086896,0.32884606500341118,0.94438353730450653,0.15788727286899965,0.98745714290089071,-0.017979010022135145,0.99983836453630037,-0.19328646493495738,0.98114236605751948,-0.36258614276206713,0.93195026105309176,-0.52061582958998343,0.85379105053890869,-0.66246360811654847,0.74909409817539219,-0.78372053106354456,0.62111362019317828,-0.88061766115225448,0.47382753704985647,0,0.98328964140703223,0.18204801866988293,0.93371703779673987,0.35801186199353979,0.85293894113455315,0.52201069212830042,0.74365501334383721,0.66856355055340644,0.60951760166825375,0.79277253563464223,0.45500967460746555,0.89048649400965552,0.28529499789475687,0.95843975511047674,0.10604555774284545,0.99436127221599335,-0.076748001003214439,0.9970505224621321,-0.25697658651315997,0.9664176291769746,-0.4286168302018421,0.90348636562359108,-0.58593239202721659,0.81035993976335241,-0.72366567308857044,0.6901507035374711,-0.83721352835246132,0.54687613583298955,-0.92278110706104532,0.38532457545709631,0,0.98207837162658185,0.18847300067458328,0.92895585603343711,0.37019051519614077,0.84253653718600863,0.53863919603627941,0.72591796491763172,0.68778129387898013,0.58328012865557111,0.81227107021950529,0.41973563298678113,0.9076464060421251,0.24114644525905019,0.97048873869763363,0.053913783580311951,0.99854559432208967,-0.13525132368548876,0.99081132383583659,-0.31956858303108082,0.94756314868166291,-0.49243146360686718,0.87035122430545164,-0.64764399680237239,0.76194307753653667,-0.77964285993994276,0.62622440941300483,-0.88369678387784778,0.46805981900174715,-0.95607613710486583,0.29311844032513168,0,0.98082512038392156,0.19488992591682555,0.92403583355226848,0.38230587009796796,0.83180999498200059,0.55506047620781296,0.70768444337727132,0.70652864669580218,0.55641936375668077,0.83090161369238569,0.38381573550391179,0.9234097038582556,0.19649286620505438,0.98050525420852419,0.0016345427963967241,0.99999866413403116,-0.19328646493495738,0.98114236605751948,-0.38079498327322114,0.92465949447023321,-0.55370010568614347,0.83271615389828568,-0.70537096235918251,0.7088383493156114,-0.8299910124563924,0.55777676470216364,-0.92278110706104521,0.38532457545709675,-0.980182768385924,0.19809528151701675,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.99997485448833301,0.0070915718312131127,0.99989941921792547,0.014182787020021789,0.99977369798249438,0.021273288941957496,0.99959769710468938,0.028362721008422635,0.99937142543577462,0.035450726684623728,0.99909489435518395,0.042536949507501906,0.99876811776994834,0.049621033103659846,0.99839111211399678,0.056702621207284122,0.99796389634732929,0.063781357678062159,0.99748649195506423,0.070856886519092929,0.9969589229463568,0.077928851894790388,0.9963812158531925,0.084996898148778824,0.99575339972905208,0.092060669821779142,0.99507550614745099,0.099119811669485289,0.99434756920035117,0.10617396868042993,0.99356962549644645,0.11322278609383818,0.99274171415932211,0.12026590941746905,0.99186387682548616,0.12730298444544313,0.99093615764227672,0.13433365727605595,0.98995860326564078,0.14135757432957619,0.98893126285778832,0.14837438236602735,0.9878541880847197,0.15538372850295276,0.98672743311362743,0.16238526023316235,0.98555105461017223,0.16937862544246041,0.98432511173563275,0.17636347242735409,0.98304966614393074,0.18333944991274065,0.98172478197853019,0.1903062070695736,0.98035052586921156,0.19726339353250619,0.97892696692872094,0.20421065941751174,0.97745417674929413,0.21114765533947941,0.97593222939905666,0.21807403242978554,0.97436120141829796,0.22498944235383814,0.97274117181562292,0.23189353732859544,0.97107222206397825,0.23878597014005598,0.96935443609655469,0.24566639416072031,0.96758790030256658,0.25253446336702357,0.96577270352290656,0.25938983235673696,0.96390893704567826,0.26623215636633868,0.9619966946016052,0.27306109128835238,0.96003607235931665,0.27987629368865247,0.95802716892051165,0.28667742082373598,0.95597008531499983,0.29346413065795957,0.95386492499562081,0.30023608188074052,0.95171179383304128,0.30699293392372184,0.94951080011043099,0.31373434697789987,0.94726205451801626,0.32045998201071341,0.94496567014751442,0.32716950078309393,0.94262176248644536,0.33386256586647645,0.94023044941232403,0.34053884065976864,0.93779185118673181,0.347197989406279,0.93530609044926916,0.35383967721060267,0.93277329221138727,0.3604635700554632,0.93019358385010154,0.36706933481851101,0.92756709510158519,0.37365663928907628,0.92489395805464514,0.38022515218487618,0.92217430714407922,0.38677454316867532,0.91940827914391454,0.393304482864899,0.91659601316053008,0.39981464287619756,0.91373765062565981,0.40630469579996198,0.91083333528928079,0.41277431524478914,0.90788321321238341,0.41922317584689667,0.90488743275962569,0.4256509532864855,0.90184614459187251,0.43205732430405047,0.89875950165861784,0.43844196671663727,0.89562765919029375,0.44480455943404529,0.89245077469046263,0.45114478247497569,0.88922900792789705,0.45746231698312367,0.88596252092854455,0.46375684524321381,0.88265147796737908,0.47002805069697851,0.87929604556013918,0.47627561795907797,0.87589639245495465,0.4824992328329612,0.87245268962385891,0.48869858232666752,0.86896511025419143,0.49487335466856658,0.86543382973988781,0.50102323932303872,0.8618590256726586,0.50714792700609113,0.8582408778330588,0.5132471097009127,0.85457956818144554,0.51932048067336412,0.85087528084882813,0.52536773448740437,0.84712820212760731,0.53138856702045034,0.84333852046220625,0.53738267547867302,0.83950642643959428,0.54334975841222388,0.83563211277970117,0.54928951573039586,0.83171577432572552,0.55520164871671518,0.82775760803433607,0.56108586004396366,0.82375781296576611,0.56694185378913242,0.8197165902738025,0.57276933544830322,0.8156341431956704,0.5785680119514599,0.81151067704181068,0.58433759167722732,0.80734639918555606,0.59007778446753667,0.80314151905270148,0.59578830164221852,0.7988962481109716,0.6014688560135204,0.79461079985938654,0.60711916190054982,0.79028538981752428,0.61273893514364153,0.78592023551468226,0.61832789311864822,0.78151555647893722,0.62388575475115404,0.7770715742261054,0.62941224053060996,0.77258851224860203,0.6349070725243906,0.76806659600420146,0.64036997439177201,0.76350605290469931,0.64580067139782893,0.75890711230447483,0.65119889042725132,0.75427000548895695,0.65656435999808027,0.749594965662993,0.66189681027536029,0.74488222793911996,0.6671959730847099,0.74013202932574029,0.67246158192580896,0.73534460871520368,0.67769337198580004,0.73052020687179176,0.68289108015260724,0.72565906641960987,0.68805444502816804,0.72076143183038621,0.69318320694157864,0.71582754941117621,0.69827710796215436,0.71085766729197553,0.70333589191239998,0.70585203541324193,0.70835930438089367,0.70081090551332503,0.71334709273508179,0.69573453111580608,0.71829900613398423,0.69062316751674868,0.72321479554080803,0.68547707177185857,0.72809421373547401,0.68029650268355712,0.73293701532704758,0.67508172078796524,0.73774295676608104,0.66983298834180072,0.74251179635686126,0.66455056930918965,0.74724329426956504,0.65923472934839089,0.7519372125523206,0.65388573579843579,0.75659331514317407,0.64850385766568397,0.76121136788196109,0.64308936561029406,0.76579113852208403,0.63764253193261222,0.77033239674219045,0.63216363055947833,0.7748349141577574,0.62665293703044911,0.77929846433257643,0.62111072848394122,0.7837228227901416,0.6155372836432943,0.78810776702493845,0.60993288280275271,0.79245307651363406,0.60429780781336973,0.7967585327261677,0.59863234206883353,0.80102391913674031,0.59293677049121374,0.80524902123470454,0.5872113795166336,0.80943362653535222,0.58145645708086413,0.81357752459060051,0.57567229260484398,0.81768050699957551,0.56985917698012367,0.82174236741909323,0.56401740255423671,0.82576290157403653,0.55814726311599727,0.82974190726762842,0.55224905388072443,0.83367918439160082,0.54632307147539683,0.83757453493625778,0.54036961392373373,0.84142776300043431,0.53438898063120777,0.84523867480134784,0.52838147236998745,0.84900707868434422,0.5223473912638108,0.8527327851325357,0.51628704077279186,0.85641560677633233,0.51020072567815822,0.86005535840286507,0.50408875206692438,0.86365185696529989,0.49795142731649822,0.86720492159204343,0.49178906007922146,0.87071437359583992,0.48560196026684888,0.87418003648275666,0.47939043903496159,0.87760173596106039,0.47315480876731858,0.88097929994998303,0.46689538306014722,0.8843125585883751,0.46061247670637201,0.88760134424324855,0.45430640567978264,0.89084549151820758,0.44797748711914442,0.89404483726176553,0.44162603931224859,0.89719922057555102,0.4352523816799046,0.90030848282239939,0.4288568347598774,0.90337246763433032,0.42243972019076631,0.90639102092041224,0.41600136069583005,0.90936399087451114,0.40954208006675591,0.91229122798292595,0.40306220314737684,0.91517258503190679,0.39656205581733445,0.91800791711505914,0.39004196497568938,0.92079708164063112,0.38350225852448244,0.92353993833868442,0.37694326535224365,0.9262363492681488,0.37036531531745115,0.92888617882375935,0.36376873923194397,0.93148929374287603,0.35715386884428407,0.93404556311218556,0.35052103682307212,0.93655485837428576,0.3438705767402182,0.93901705333414986,0.33720282305416577,0.94143202416547367,0.33051811109307067,0.94379964941690275,0.32381677703793821,0.94611981001814049,0.31709915790571602,0.94839238928593572,0.31036559153234422,0.95061727292995157,0.30361641655576654,0.9527943490585129,0.29685197239889949,0.95492350818423299,0.29007259925256162,0.95700464322952106,0.28327863805836612,0.95903764953196557,0.27647043049157422,0.96102242484959921,0.26964831894391111,0.96295886936604036,0.262812646506348,0.96484688569551247,0.2559637569518472,0.96668637888774234,0.24910199471807265,0.96847725643273486,0.24222770489006917,0.97021942826542573,0.23534123318290714,0.97191280677021052,0.22844292592429546,0.97355730678535146,0.2215331300371656,0.97515284560725979,0.21461219302222401,0.97669934299465544,0.20768046294047518,0.97819672117260237,0.20073828839571856,0.97964490483641942,0.19378601851701643,0.9810438211554684,0.18682400294113505,0.98239339977681583,0.17985259179496241,0.98369357282877201,0.17287213567789933,0.98494427492430348,0.16588298564422685,0.98614544316432207,0.15888549318545261,0.98729701714084783,0.15188001021263339,0.98839893894004682,0.14486688903867637,0.98945115314514431,0.13784648236062236,0.99045360683921113,0.13081914324190769,0.99140624960782509,0.12378522509460746,0.9923090335416066,0.11674508166166361,0.99316191323862768,0.109699066999094,0.99396484580669564,0.10264753545818599,0.99471779086550993,0.095590841667677076,0.99542071054869308,0.088529340515919555,0.99607356950569492,0.081463387133032181,0.99667633490357022,0.074393336873041643,0.99722897642863051,0.067319545296010738,0.99773146628796783,0.060242368150156295,0.99818377921085311,0.053162161353959521,0.99858589245000628,0.04607928097826583,0.99893778578274139,0.038994083228377024,0.99923944151198241,0.03190692442613869,0.99949084446715397,0.024818160992019746,0.99969198200494447,0.017728149427187024,0.99984284400994106,0.010637246295577793,0.99994342289513916,0.0035458082059671202,0.99999371360232381,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.99994516936551214,0.010471784116245792,0.9997806834748455,0.020942419883356957,0.9995065603657316,0.031410759078128292,0.99912283009885838,0.041875653729199623,0.99862953475457383,0.052335956242943828,0.99802672842827156,0.06279051952931336,0.9973144772244581,0.073238197127631674,0.99649285924950437,0.083677843332315482,0.99556196460308,0.094108313318514311,0.99452189536827329,0.10452846326765346,0.99337276560039645,0.1149371504928666,0.99211470131447788,0.12533323356430423,0.9907478404714436,0.13571557243430438,0.98927233296298833,0.14608302856241159,0.98768834059513777,0.15643446504023087,0.98599603707050498,0.16676874671610226,0.98419560796924188,0.17708474031958327,0.98228725072868872,0.1873813145857246,0.98027117462172186,0.19765734037912613,0.97814760073380569,0.20791169081775931,0.97591676193874743,0.21814324139654251,0.97357890287316029,0.22835087011065572,0.97113427990963608,0.23853345757858085,0.96858316112863119,0.24868988716485474,0.96592582628906831,0.25881904510252074,0.96316256679765822,0.2689198206152657,0.96029368567694307,0.27899110603922922,0.95731949753206724,0.28903179694447156,0.95424032851627694,0.29904079225608665,0.95105651629515353,0.3090169943749474,0.94776841000958567,0.31895930929806993,0.94437637023748111,0.32886664673858318,0.94088076895422545,0.33873792024529137,0.93728198949189157,0.34857204732181518,0.93358042649720174,0.35836794954530021,0.92977648588825146,0.36812455268467792,0.92587058480999473,0.37784078681846711,0.92186315158850052,0.38751558645210293,0.91775462568398114,0.39714789063478056,0.91354545764260087,0.40673664307580015,0.90923610904706853,0.4162807922604011,0.90482705246601958,0.4257792915650726,0.90031877140219352,0.43523109937232746,0.8957117602394129,0.44463517918492745,0.8910065241883679,0.45399049973954675,0.88620357923121473,0.46329603511986167,0.88130345206499228,0.47255076486905395,0.87630668004386358,0.48175367410171521,0.87121381112018947,0.49090375361514077,0.86602540378443871,0.49999999999999994,0.86074202700394364,0.50904141575037132,0.85536426016050671,0.51802700937313018,0.84989269298686398,0.52695579549667759,0.84432792550201519,0.53582679497899655,0.83867056794542405,0.54463903501502697,0.83292124071009954,0.55339154924334399,0.82708057427456183,0.56208337785213058,0.82114920913370404,0.5707135676844316,0.81512779572855421,0.57928117234267884,0.80901699437494745,0.58778525229247314,0.80281747519111457,0.59622487496561571,0.79652991802419637,0.60459911486237483,0.79015501237569041,0.61290705365297637,0.78369345732583984,0.6211477802783103,0.7771459614569709,0.62932039104983739,0.77051324277578925,0.63742398974868963,0.76379602863464224,0.64545768772395051,0.75699505565175651,0.65342060399010538,0.75011106963045959,0.66131186532365183,0.74314482547739436,0.66913060635885813,0.73609708711973443,0.67687596968266073,0.72896862742141155,0.68454710592868862,0.72176022809836227,0.6921431738704068,0.71447267963280336,0.69966334051336543,0.70710678118654768,0.70710678118654746,0.69966334051336554,0.71447267963280325,0.69214317387040691,0.72176022809836204,0.68454710592868873,0.72896862742141144,0.67687596968266073,0.73609708711973421,0.66913060635885824,0.74314482547739424,0.66131186532365194,0.75011106963045959,0.6534206039901056,0.75699505565175629,0.64545768772395062,0.76379602863464213,0.63742398974868975,0.77051324277578914,0.6293203910498375,0.77714596145697079,0.62114778027831041,0.78369345732583973,0.6129070536529766,0.7901550123756903,0.60459911486237494,0.79652991802419626,0.59622487496561594,0.80281747519111446,0.58778525229247325,0.80901699437494734,0.57928117234267895,0.81512779572855409,0.57071356768443182,0.82114920913370393,0.56208337785213069,0.82708057427456172,0.55339154924334411,0.83292124071009943,0.54463903501502708,0.83867056794542394,0.53582679497899677,0.84432792550201496,0.5269557954966777,0.84989269298686387,0.51802700937313029,0.8553642601605066,0.50904141575037143,0.86074202700394353,0.50000000000000011,0.8660254037844386,0.49090375361514094,0.87121381112018936,0.48175367410171532,0.87630668004386358,0.47255076486905406,0.88130345206499217,0.46329603511986178,0.88620357923121462,0.45399049973954686,0.8910065241883679,0.44463517918492751,0.89571176023941279,0.43523109937232773,0.90031877140219341,0.42577929156507283,0.90482705246601947,0.41628079226040138,0.90923610904706842,0.40673664307580037,0.91354545764260076,0.39714789063478079,0.91775462568398103,0.3875155864521031,0.92186315158850052,0.37784078681846728,0.92587058480999473,0.36812455268467809,0.92977648588825135,0.35836794954530038,0.93358042649720174,0.34857204732181529,0.93728198949189145,0.33873792024529148,0.94088076895422545,0.32886664673858329,0.944376370237481,0.31895930929807004,0.94776841000958567,0.30901699437494745,0.95105651629515353,0.29904079225608693,0.95424032851627683,0.28903179694447184,0.95731949753206724,0.2789911060392295,0.96029368567694295,0.26891982061526593,0.9631625667976581,0.25881904510252096,0.9659258262890682,0.24868988716485496,0.96858316112863108,0.23853345757858105,0.97113427990963597,0.22835087011065588,0.97357890287316018,0.2181432413965427,0.97591676193874732,0.20791169081775945,0.97814760073380558,0.19765734037912627,0.98027117462172186,0.18738131458572474,0.98228725072868861,0.17708474031958338,0.98419560796924188,0.16676874671610234,0.98599603707050487,0.15643446504023092,0.98768834059513777,0.14608302856241187,0.98927233296298833,0.13571557243430463,0.9907478404714436,0.12533323356430448,0.99211470131447776,0.11493715049286683,0.99337276560039645,0.10452846326765368,0.99452189536827329,0.094108313318514505,0.99556196460308,0.083677843332315663,0.99649285924950437,0.073238197127631854,0.9973144772244581,0.062790519529313527,0.99802672842827156,0.052335956242943966,0.99862953475457383,0.041875653729199748,0.99912283009885838,0.031410759078128396,0.9995065603657316,0.020942419883357051,0.9997806834748455,0.010471784116245868,0.99994516936551214,0,0,0.9997806834748455,0.020942419883356957,0.99912283009885838,0.041875653729199623,0.99802672842827156,0.06279051952931336,0.99649285924950437,0.083677843332315482,0.99452189536827329,0.10452846326765346,0.99211470131447788,0.12533323356430423,0.98927233296298833,0.14608302856241159,0.98599603707050498,0.16676874671610226,0.98228725072868872,0.1873813145857246,0.97814760073380569,0.20791169081775931,0.97357890287316029,0.22835087011065572,0.96858316112863119,0.24868988716485474,0.96316256679765822,0.2689198206152657,0.95731949753206724,0.28903179694447156,0.95105651629515353,0.3090169943749474,0.94437637023748111,0.32886664673858318,0.93728198949189157,0.34857204732181518,0.92977648588825146,0.36812455268467792,0.92186315158850052,0.38751558645210293,0.91354545764260087,0.40673664307580015,0.90482705246601958,0.4257792915650726,0.8957117602394129,0.44463517918492745,0.88620357923121473,0.46329603511986167,0.87630668004386358,0.48175367410171521,0.86602540378443871,0.49999999999999994,0.85536426016050671,0.51802700937313018,0.84432792550201519,0.53582679497899655,0.83292124071009954,0.55339154924334399,0.82114920913370404,0.5707135676844316,0.80901699437494745,0.58778525229247314,0.79652991802419637,0.60459911486237483,0.78369345732583984,0.6211477802783103,0.77051324277578925,0.63742398974868963,0.75699505565175651,0.65342060399010538,0.74314482547739436,0.66913060635885813,0.72896862742141155,0.68454710592868862,0.71447267963280336,0.69966334051336543,0,0.99912283009885838,0.041875653729199623,0.99649285924950437,0.083677843332315482,0.99211470131447788,0.12533323356430423,0.98599603707050498,0.16676874671610226,0.97814760073380569,0.20791169081775931,0.96858316112863119,0.24868988716485474,0.95731949753206724,0.28903179694447156,0.94437637023748111,0.32886664673858318,0.92977648588825146,0.36812455268467792,0.91354545764260087,0.40673664307580015,0.8957117602394129,0.44463517918492745,0.87630668004386358,0.48175367410171521,0.85536426016050671,0.51802700937313018,0.83292124071009954,0.55339154924334399,0.80901699437494745,0.58778525229247314,0.78369345732583984,0.6211477802783103,0.75699505565175651,0.65342060399010538,0.72896862742141155,0.68454710592868862,0.69966334051336554,0.71447267963280325,0.66913060635885824,0.74314482547739424,0.63742398974868975,0.77051324277578914,0.60459911486237494,0.79652991802419626,0.57071356768443182,0.82114920913370393,0.53582679497899677,0.84432792550201496,0.50000000000000011,0.8660254037844386,0.46329603511986178,0.88620357923121462,0.42577929156507283,0.90482705246601947,0.3875155864521031,0.92186315158850052,0.34857204732181529,0.93728198949189145,0.30901699437494745,0.95105651629515353,0.26891982061526593,0.9631625667976581,0.22835087011065588,0.97357890287316018,0.18738131458572474,0.98228725072868861,0.14608302856241187,0.98927233296298833,0.10452846326765368,0.99452189536827329,0.062790519529313527,0.99802672842827156,0.020942419883357051,0.9997806834748455,0,0.99802672842827156,0.06279051952931336,0.99211470131447788,0.12533323356430423,0.98228725072868872,0.1873813145857246,0.96858316112863119,0.24868988716485474,0.95105651629515364,0.30901699437494734,0.92977648588825146,0.36812455268467792,0.90482705246601958,0.4257792915650726,0.87630668004386358,0.48175367410171521,0.84432792550201519,0.53582679497899655,0.80901699437494745,0.58778525229247303,0.77051324277578936,0.63742398974868963,0.72896862742141155,0.68454710592868862,0.68454710592868873,0.72896862742141144,0.63742398974868975,0.77051324277578914,0.58778525229247325,0.80901699437494734,0.53582679497899677,0.84432792550201496,0.48175367410171532,0.87630668004386358,0.42577929156507283,0.90482705246601947,0.36812455268467809,0.92977648588825135,0.30901699437494767,0.95105651629515353,0.24868988716485496,0.96858316112863108,0.18738131458572493,0.98228725072868861,0.12533323356430448,0.99211470131447776,0.062790519529313527,0.99802672842827156,2.8327694488239898e-16,1,-0.06279051952931318,0.99802672842827156,-0.12533323356430393,0.99211470131447788,-0.18738131458572438,0.98228725072868872,-0.24868988716485441,0.96858316112863119,-0.30901699437494712,0.95105651629515364,-0.36812455268467759,0.92977648588825157,-0.42577929156507233,0.90482705246601969,-0.48175367410171505,0.87630668004386369,-0.53582679497899643,0.84432792550201519,-0.58778525229247269,0.80901699437494767,-0.63742398974868941,0.77051324277578948,-0.68454710592868839,0.72896862742141177,0,0.99649285924950437,0.083677843332315482,0.98599603707050498,0.16676874671610226,0.96858316112863119,0.24868988716485474,0.94437637023748111,0.32886664673858318,0.91354545764260087,0.40673664307580015,0.87630668004386358,0.48175367410171521,0.83292124071009954,0.55339154924334399,0.78369345732583984,0.6211477802783103,0.72896862742141155,0.68454710592868862,0.66913060635885824,0.74314482547739424,0.60459911486237494,0.79652991802419626,0.53582679497899677,0.84432792550201496,0,0.98599603707050498,0.16676874671610226,0.94437637023748111,0.32886664673858318,0.87630668004386358,0.48175367410171521,0.78369345732583984,0.6211477802783103,0.66913060635885824,0.74314482547739424,0.53582679497899677,0.84432792550201496,0.3875155864521031,0.92186315158850052,0.22835087011065588,0.97357890287316018,0.062790519529313527,0.99802672842827156,-0.10452846326765333,0.9945218953682734,-0.26891982061526559,0.96316256679765822,-0.42577929156507233,0.90482705246601969,0,0.96858316112863119,0.24868988716485474,0.87630668004386358,0.48175367410171521,0,0.87630668004386358,0.48175367410171521,0.53582679497899677,0.84432792550201496,0,0.72896862742141155,0.68454710592868862,0.062790519529313527,0.99802672842827156,0,0.53582679497899677,0.84432792550201496,-0.42577929156507233,0.90482705246601969,0,0,0,0,0,0.99955243228350332,0.029915466169398455,0.99821012976773515,0.059804153945034168,0.99597429399523907,0.089639308903433496,0.99284692634183735,0.11939422454024434,0.98883082622512852,0.14904226617617444,0.98392958859862967,0.17855689479863665,0.97814760073380569,0.20791169081775934,0.9714900382928674,0.2370803777154975,0.96396286069585324,0.26603684556667512,0.95557280578614068,0.29475517441090421,0.94632738379916415,0.32320965745446001,0.9362348706397372,0.35137482408134268,0.9253043004739967,0.37922546265292839,0.91354545764260087,0.40673664307580021,0.90096886790241915,0.43388373911755812,0.88758578900455409,0.46064245045063229,0.87340820061712976,0.4869888244043673,0.8584487936018661,0.51289927740590613,0.84272095865403918,0.53835061609068235,0.82623877431599491,0.56332005806362206,0.80901699437494745,0.58778525229247314,0.79107103465634121,0.61172429911500636,0.77241695922459952,0.63511576984217877,0.75307146600361097,0.65793872593971259,0.73305187182982634,0.68017273777091947,0.71237609695134474,0.70179790288399135,0.69106264898686465,0.72279486382739155,0.66913060635885824,0.74314482547739424,0.64659960121579962,0.76282957186226652,0.62348980185873359,0.7818314824680298,0.59982189468791369,0.80013354801120629,0.5756170656856735,0.81771938566443136,0.55089698145210253,0.83457325372130264,0.52568376981050469,0.85068006568733956,0.49999999999999989,0.86602540378443871,0.47386866247299869,0.880595531856738,0.44731314831563262,0.89437740766633689,0.4203572283095654,0.90735869456786489,0.39302503165392366,0.91952777255145057,0.36534102436639498,0.93087374864420425,0.33732998738282988,0.9413864666609032,0.30901699437494745,0.95105651629515353,0.28042738930600275,0.95987524154288906,0.25158676374450839,0.96783474845066653,0.22252093395631445,0.97492791218182362,0.19325591779555323,0.98114838339417265,0.1638179114151376,0.98649059392352145,0.13423326581765554,0.9909497617679347,0.10452846326765346,0.99452189536827329,0.074730093586424171,0.99720379718118013,0.044864830350514986,0.99899306654131459,0.014959407015263606,0.99988810181027343,0,0.99821012976773515,0.059804153945034168,0.99284692634183735,0.11939422454024434,0.98392958859862967,0.17855689479863665,0.9714900382928674,0.2370803777154975,0.95557280578614068,0.29475517441090421,0.9362348706397372,0.35137482408134268,0.91354545764260087,0.40673664307580021,0.88758578900455409,0.46064245045063229,0.8584487936018661,0.51289927740590613,0.82623877431599491,0.56332005806362206,0.79107103465634121,0.61172429911500636,0.75307146600361097,0.65793872593971259,0.71237609695134474,0.70179790288399135,0.66913060635885824,0.74314482547739424,0.62348980185873359,0.7818314824680298,0.5756170656856735,0.81771938566443136,0.52568376981050469,0.85068006568733956,0,0.99284692634183735,0.11939422454024434,0.9714900382928674,0.2370803777154975,0.9362348706397372,0.35137482408134268,0.88758578900455409,0.46064245045063229,0.82623877431599491,0.56332005806362206,0.75307146600361097,0.65793872593971259,0.66913060635885824,0.74314482547739424,0.5756170656856735,0.81771938566443136,0.47386866247299869,0.880595531856738,0.36534102436639498,0.93087374864420425,0.25158676374450839,0.96783474845066653,0.13423326581765554,0.9909497617679347,0.014959407015263606,0.99988810181027343,-0.10452846326765355,0.99452189536827329,-0.22252093395631434,0.97492791218182362,-0.33732998738282999,0.9413864666609032,-0.44731314831563268,0.89437740766633678,0,0.98392958859862967,0.17855689479863665,0.9362348706397372,0.35137482408134268,0.8584487936018661,0.51289927740590613,0,0.9362348706397372,0.35137482408134268,0.75307146600361097,0.65793872593971259,0.47386866247299869,0.880595531856738,0,0.8584487936018661,0.51289927740590613,0.47386866247299869,0.880595531856738,-0.044864830350514862,0.9989930665413147,0,0.75307146600361097,0.65793872593971259,0.13423326581765554,0.9909497617679347,-0.55089698145210242,0.83457325372130275,0,0,0,0,0,0,0,0.99996117174520505,0.0088122075529626955,0.999844689996087,0.017623730780645046,0.99965056379821193,0.026433885410909019,0.99937880822674274,0.035241987277897083,0.99902944438526853,0.044047352375162142,0.9986024994041659,0.052849296908785058,0.99809800643849178,0.061647137350475764,0.99751600466540913,0.070440190490653629,0.99685653928114404,0.079227773491503145,0.99611966149747655,0.088009203940000738,0.99530542853776338,0.09678379990090856,0.99441390363249416,0.10555087996973124,0.99344515601438121,0.11430976332563132,0.99239926091298314,0.1230597697842995,0.99127629954886309,0.13180021985077531,0,0.999844689996087,0.017623730780645046,0.99937880822674274,0.035241987277897083,0.9986024994041659,0.052849296908785058,0.99751600466540913,0.070440190490653629,0.99611966149747655,0.088009203940000738,0.99441390363249416,0.10555087996973124,0.99239926091298314,0.1230597697842995,0.99007635912728087,0.1405304347722143,0.98744591981515817,0.15795744819538038,0.9845087600436947,0.17533539687475186,0.98126579215348175,0.19265888287177388,0.97771802347523074,0.20992252516509055,0.97386655601687633,0.22712096132199761,0.96971258612127043,0.24424884916412135,0.96525740409457461,0.26130086842680633,0,0.99965056379821193,0.026433885410909019,0.9986024994041659,0.052849296908785058,0.99685653928114404,0.079227773491503145,0.99441390363249416,0.10555087996973124,0.99127629954886309,0.13180021985077531,0.98744591981515817,0.15795744819538038,0.98292544137807047,0.18400428443850239,0.97771802347523074,0.20992252516509055,0.97182730542730511,0.2356940568319518,0.96525740409457461,0.26130086842680633,0.9580129109997747,0.28672506405568676,0.95009888911920748,0.31194887544988514,0.94152086934436641,0.33695467438370491,0.93228484661654942,0.36172498499434197,0.92239727573715991,0.38624249599528243,0,0.99937880822674274,0.035241987277897083,0.99751600466540913,0.070440190490653629,0.99441390363249416,0.10555087996973124,0.99007635912728087,0.1405304347722143,0.9845087600436947,0.17533539687475186,0.97771802347523074,0.20992252516509055,0.96971258612127043,0.24424884916412135,0.96050239380546487,0.27827172241169551,0.95009888911920748,0.31194887544988514,0.93851499720554654,0.34523846833786209,0.92576510970120018,0.37809914263315209,0.91186506685662383,0.41049007277468347,0.8968321378563433,0.44237101680379198,0.88068499936400457,0.47370236636016844,0.86344371231879369,0.50444519589063408,0,0.99902944438526853,0.044047352375162142,0.99611966149747655,0.088009203940000738,0.99127629954886309,0.13180021985077531,0.9845087600436947,0.17533539687475186,0.97583017952890083,0.21853022839093245,0.96525740409457461,0.26130086842680633,0.95281095667383808,0.30356429441270844,0.93851499720554654,0.34523846833786209,0.92239727573715991,0.38624249599528249,0.90448907855881377,0.42649678400643065,0.88482516747315054,0.46592319432081408,0.86344371231879369,0.50444519589063408,0.84038621687844572,0.54198801322606205,0.81569743831542896,0.57847877154278271,0.78942530029505387,0.6138466382200557,0,0.9986024994041659,0.052849296908785058,0.99441390363249416,0.10555087996973124,0.98744591981515817,0.15795744819538038,0.97771802347523074,0.20992252516509055,0.96525740409457461,0.26130086842680633,0.95009888911920748,0.31194887544988514,0.93228484661654942,0.36172498499434197,0.91186506685662383,0.41049007277468347,0.8888966231481934,0.45810784031245166,0.86344371231879369,0.50444519589063408,0.83557747528452464,0.54937262654517072,0.80537579821110405,0.59276456005384381,0.77292309482194277,0.63449971591078747,0.73831007046168617,0.67446144430564758,0.70163346857466846,0.71253805215993882,0,0.99809800643849178,0.061647137350475764,0.99239926091298314,0.1230597697842995,0.98292544137807047,0.18400428443850239,0.96971258612127043,0.24424884916412135,0.95281095667383808,0.30356429441270838,0.93228484661654942,0.36172498499434197,0.90821233700774806,0.41850967839098374,0.88068499936400457,0.47370236636016844,0.8498075473232467,0.52709309662757664,0.81569743831542896,0.5784787715427826,0.77848442675598184,0.62766392066010157,0.73831007046168617,0.67446144430564758,0.6953271921665608,0.71869332530208363,0.64969929818615069,0.76019130614367281,0.60159995644160769,0.79879752904566226,0,0.99751600466540913,0.070440190490653629,0.99007635912728087,0.1405304347722143,0.97771802347523074,0.20992252516509055,0.96050239380546487,0.27827172241169551,0.93851499720554654,0.34523846833786209,0.91186506685662383,0.41049007277468347,0.88068499936400457,0.47370236636016844,0.84512969701205654,0.5345613110096068,0.80537579821110405,0.59276456005384381,0.76162079995945398,0.64802296029471163,0.71408207668015056,0.70006198851541956,0.66299580030687011,0.74862311530933423,0.60861576698395847,0.79346508945165828,0.55121213620955356,0.83436513643326482,0.49107008868571961,0.87112006520238039,0,0.99685653928114404,0.079227773491503145,0.98744591981515817,0.15795744819538038,0.97182730542730511,0.2356940568319518,0.95009888911920748,0.31194887544988514,0.92239727573715991,0.38624249599528249,0.8888966231481934,0.45810784031245166,0.8498075473232467,0.52709309662757664,0.80537579821110405,0.59276456005384381,0.75588071472777374,0.65470935925999252,0.70163346857466835,0.71253805215993893,0.64297510792656476,0.76588707430457559,0.58027441328852247,0.81442102458290022,0.51392557900182079,0.85783477386245144,0.44434573497510427,0.89585538331219194,0.37197232422141663,0.92824382034749753,0,0.99611966149747655,0.088009203940000738,0.9845087600436947,0.17533539687475186,0.96525740409457461,0.26130086842680633,0.93851499720554654,0.34523846833786209,0.90448907855881377,0.42649678400643065,0.86344371231879369,0.50444519589063408,0.81569743831542896,0.57847877154278271,0.76162079995945398,0.64802296029471163,0.70163346857466835,0.71253805215993893,0.63620098646434409,0.77152336634854779,0.56583115398777784,0.82452113688907913,0.49107008868571961,0.87112006520238039,0.41249798703853191,0.9109585120570306,0.33072462174870593,0.94372730413460826,0.24638460949187202,0.96917213342395359,0,0.99530542853776338,0.09678379990090856,0.98126579215348175,0.19265888287177388,0.9580129109997747,0.28672506405568676,0.92576510970120018,0.37809914263315209,0.88482516747315054,0.46592319432081403,0.83557747528452464,0.54937262654517072,0.77848442675598184,0.62766392066010157,0.71408207668015056,0.70006198851541956,0.64297510792656476,0.76588707430457548,0.56583115398777795,0.82452113688907913,0.48337453047308038,0.87541365267508198,0.39637943440572077,0.91808678455808357,0.305662675176404,0.95213986840379927,0.21207600540317936,0.97725317494098252,0.11649812370437293,0.99319091174524987,0,0.99441390363249416,0.10555087996973124,0.97771802347523074,0.20992252516509055,0.95009888911920748,0.31194887544988514,0.91186506685662383,0.41049007277468347,0.86344371231879369,0.50444519589063408,0.80537579821110405,0.59276456005384381,0.73831007046168617,0.67446144430564758,0.66299580030687011,0.74862311530933423,0.58027441328852247,0.81442102458290022,0.49107008868571961,0.87112006520238039,0.39637943440572077,0.91808678455808357,0.29726035268834611,0.95479646140923669,0.19482022101825985,0.98083896817081873,0.090203520290279851,0.99592335293798639,-0.015420951551759477,0.9998810900568319,0,0.99344515601438121,0.11430976332563132,0.97386655601687633,0.22712096132199761,0.9415208693443663,0.33695467438370497,0.8968321378563433,0.44237101680379198,0.84038621687844572,0.54198801322606205,0.77292309482194266,0.63449971591078758,0.6953271921665608,0.71869332530208374,0.60861576698395847,0.79346508945165828,0.51392557900182079,0.85783477386245144,0.41249798703853191,0.9109585120570306,0.305662675176404,0.95213986840379927,0.19482022101825963,0.98083896817081884,0.081423734552078575,0.9966795751150882,-0.033040191667533338,0.99945402382229298,-0.14707097128387378,0.98912594213558969,0,0.99239926091298314,0.1230597697842995,0.96971258612127043,0.24424884916412135,0.93228484661654942,0.36172498499434197,0.88068499936400457,0.47370236636016844,0.81569743831542896,0.5784787715427826,0.73831007046168617,0.67446144430564758,0.64969929818615069,0.76019130614367281,0.55121213620955356,0.83436513643326482,0.44434573497510427,0.89585538331219194,0.33072462174870615,0.94372730413460815,0.21207600540317936,0.97725317494098252,0.090203520290279851,0.99592335293798639,-0.033040191667533116,0.99945402382229298,-0.1557816438728464,0.98779151617751493,-0.27615498481891132,0.96111311735906868,0,0.99127629954886309,0.13180021985077531,0.96525740409457461,0.26130086842680633,0.92239727573715991,0.38624249599528249,0.86344371231879369,0.50444519589063408,0.78942530029505387,0.6138466382200557,0.70163346857466835,0.71253805215993893,0.60159995644160769,0.79879752904566237,0.49107008868571961,0.87112006520238039,0.37197232422141663,0.92824382034749753,0.24638460949187202,0.96917213342395359,0.11649812370437271,0.99319091174524987,-0.015420951551759699,0.9998810900568319,-0.147070971283874,0.98912594213558969,-0.27615498481891154,0.96111311735906857,-0.40042081162265242,0.91633136671154958,0,0.99007635912728087,0.1405304347722143,0.96050239380546487,0.27827172241169551,0.91186506685662383,0.41049007277468347,0.84512969701205654,0.5345613110096068,0.76162079995945398,0.64802296029471163,0.66299580030687011,0.74862311530933423,0.55121213620955356,0.83436513643326482,0.42848840954338091,0.90354727761583342,0.29726035268834611,0.95479646140923669,0.16013248586175727,0.98709553082350343,0.01982642447167297,0.99980343712785313,-0.12087313755090549,0.99266796292546877,-0.259173696357056,0.96583072798323233,-0.39233036179060116,0.91982437846431098,-0.51770033599639897,0.85556201534968557,0,0.98879953283142141,0.14924973659059776,0.95544903225527433,0.2951561396319915,0.90069558064507649,0.43445076937028021,0.82576570647508063,0.56401329595117788,0.73233790893646022,0.6809413977241896,0.62250505798714317,0.78261577595932952,0.49872751210930794,0.86675882958598127,0.36377800398057814,0.93148567558492623,0.22067952867137736,0.9753463721290907,0.072637625730854222,0.99735839863520692,-0.077031427894072579,0.99702866514288357,-0.22497490556084701,0.97436455799043098,-0.36787873514064473,0.92987377435398155,-0.50254173733052021,0.86455294935638405,-0.62594733506077405,0.77986533050925855,0,0.98744591981515817,0.15795744819538038,0.95009888911920748,0.31194887544988514,0.8888966231481934,0.45810784031245166,0.80537579821110405,0.59276456005384381,0.70163346857466835,0.71253805215993893,0.58027441328852247,0.81442102458290022,0.44434573497510427,0.89585538331219194,0.29726035268834611,0.95479646140923669,0.14271130979474017,0.98976435683281183,-0.015420951551759699,0.9998810900568319,-0.17316602117364485,0.98489264852109071,-0.32656321056532189,0.94517536441935956,-0.47176099849528641,0.88172646569031277,-0.60511373561886883,0.79613903745851944,-0.72327318002663465,0.69056202259765154,0,0.98601562519535335,0.16665289337607242,0.94445362625876683,0.32864471370564519,0.87647644033175987,0.48144475232716688,0.78398530430666902,0.6207793832201417,0.66956707960805928,0.7427515909812209,0.53642190091326591,0.84394996547224188,0.3882736723868882,0.92154411469619801,0.2292659147376408,0.9733638273222982,0.063845876125150705,0.99795977078327758,-0.10335985181026972,0.99464402729507162,-0.26767473393075503,0.96350933405707051,-0.42450308844119661,0.90542648950861027,-0.56945862236265488,0.82201999818546223,-0.69848711066239877,0.71562263535923309,-0.80797978785870728,0.58921020222989884,0,0.9845087600436947,0.17533539687475186,0.93851499720554654,0.34523846833786209,0.86344371231879369,0.50444519589063408,0.76162079995945398,0.64802296029471163,0.63620098646434409,0.77152336634854779,0.49107008868571961,0.87112006520238039,0.33072462174870593,0.94372730413460826,0.16013248586175727,0.98709553082350343,-0.015420951551759699,0.9998810900568319,-0.19049660964359094,0.98168785350247523,-0.35967021035371921,0.93307949274652446,-0.51770033599639897,0.85556201534968557,-0.65969082137831836,0.75153710499828263,-0.78124244913835073,0.62422771138768862,-0.87858924841107544,0.47757819524813055,0,0.98292544137807047,0.18400428443850239,0.93228484661654942,0.36172498499434197,0.8498075473232467,0.52709309662757664,0.73831007046168617,0.67446144430564758,0.60159995644160769,0.79879752904566237,0.44434573497510427,0.89585538331219194,0.27191749890812733,0.96232056706045133,0.090203520290279851,0.99592335293798639,-0.094590828917769196,0.99551623547014512,-0.27615498481891154,0.96111311735906857,-0.44828869176599678,0.89388883471868641,-0.60511373561886883,0.79613903745851944,-0.74127467956822257,0.67120179486576825,-0.85212174757509718,0.52334360348585751,-0.93386961011798764,0.35761369003168447,0,0.98126579215348175,0.19265888287177388,0.92576510970120018,0.37809914263315209,0.83557747528452464,0.54937262654517072,0.71408207668015056,0.70006198851541956,0.56583115398777795,0.82452113688907913,0.39637943440572077,0.91808678455808357,0.21207600540317936,0.97725317494098252,0.01982642447167297,0.99980343712785313,-0.17316602117364463,0.98489264852109082,-0.35967021035371899,0.93307949274652457,-0.53269812657985816,0.846305326663084,-0.68576668796040186,0.72782144079699995,-0.81314065800800828,0.58206723863682908,-0.9100475358644613,0.41450389921811598,-0.97285637434672123,0.23140975539711409,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.99992104420381611,0.012566039883352607,0.99968418928329994,0.025130095443337479,0.9992894726405892,0.037690182669934541,0.99873695660601747,0.050244318179769556,0.99802672842827156,0.062790519529313374,0.99715890026061393,0.075326805527932722,0.9961336091431725,0.08785119655074318,0.99495101698130017,0.10036171485121489,0.9936113105200084,0.11285638487348168,0.99211470131447788,0.12533323356430426,0.99046142569665119,0.13779029068463808,0.98865174473791406,0.15022558912075706,0.98668594420786804,0.16263716519488358,0.98456433452920533,0.17502305897527606,0.98228725072868872,0.18738131458572463,0.97985505238424686,0.19970998051440703,0.97726812356819348,0.21200710992205465,0.97452687278657713,0.22427076094938117,0.97163173291467397,0.23649899702372471,0.96858316112863108,0.24868988716485479,0.96538163883327388,0.26084150628989694,0.96202767158608593,0.27295193551732522,0.95852178901737584,0.28501926246997611,0.95486454474664295,0.29704158157703492,0.95105651629515353,0.3090169943749474,0.94709830499474434,0.32094360980720948,0.94299053589286441,0.33281954452298668,0.93873385765387407,0.34464292317451706,0.93432894245661202,0.35641187871325075,0.92977648588825135,0.36812455268467797,0.92507720683445804,0.37977909552180111,0.92023184736587038,0.39137366683720243,0.91524117262091753,0.40290643571366264,0.91010597068499566,0.41437558099328414,0.90482705246601958,0.42577929156507266,0.89940525156637108,0.43711576665093288,0.89384142415126377,0.44838321609003223,0.88813644881354448,0.45957986062148787,0.88229122643495328,0.47070393216533257,0.87630668004386358,0.48175367410171532,0.87018375466952569,0.49272734154829156,0.86392341719283527,0.5036232016357608,0.85752665619365231,0.51443953378150642,0.85099448179469184,0.52517462996129571,0.84432792550201508,0.53582679497899666,0.83752804004214176,0.54639434673426912,0.83059589919581267,0.55687561648818795,0.82353259762842745,0.56726894912675652,0.81633925071718394,0.57757270342226763,0.80901699437494745,0.58778525229247314,0.80156698487087663,0.59790498305751882,0.79399039864783538,0.60793029769460538,0.78628843213661892,0.61785961309033433,0.77846230156702334,0.62769136129070058,0.77051324277578914,0.63742398974868975,0.76244251101144789,0.64705596156944434,0.75425138073610376,0.65658575575295652,0.74594114542418211,0.66601186743425167,0.73751311735817393,0.67533280812102447,0.72896862742141155,0.68454710592868873,0.72030902488790682,0.69365330581280504,0.71153567720928534,0.70264996979884919,0,0.99968418928329994,0.025130095443337479,0.99873695660601747,0.050244318179769556,0.99715890026061393,0.075326805527932722,0.99495101698130017,0.10036171485121489,0.99211470131447788,0.12533323356430426,0.98865174473791406,0.15022558912075706,0.98456433452920533,0.17502305897527606,0.97985505238424686,0.19970998051440703,0.97452687278657713,0.22427076094938117,0.96858316112863108,0.24868988716485479,0.96202767158608593,0.27295193551732522,0.95486454474664295,0.29704158157703492,0.94709830499474434,0.32094360980720948,0.93873385765387407,0.34464292317451706,0.92977648588825135,0.36812455268467797,0.92023184736587038,0.39137366683720243,0.91010597068499566,0.41437558099328414,0.89940525156637108,0.43711576665093288,0.88813644881354448,0.45957986062148787,0.87630668004386358,0.48175367410171532,0.86392341719283527,0.5036232016357608,0.85099448179469184,0.52517462996129571,0.83752804004214176,0.54639434673426912,0.82353259762842745,0.56726894912675652,0.80901699437494745,0.58778525229247314,0.79399039864783538,0.60793029769460538,0.77846230156702334,0.62769136129070058,0.76244251101144789,0.64705596156944434,0.74594114542418211,0.66601186743425167,0.72896862742141155,0.68454710592868873,0.71153567720928534,0.70264996979884919,0.69365330581280493,0.72030902488790682,0.67533280812102447,0.73751311735817393,0.65658575575295641,0.75425138073610376,0.63742398974868975,0.77051324277578925,0.61785961309033433,0.78628843213661892,0.59790498305751894,0.80156698487087652,0.57757270342226752,0.81633925071718405,0.55687561648818795,0.83059589919581267,0.53582679497899655,0.84432792550201508,0.51443953378150642,0.85752665619365231,0.49272734154829156,0.87018375466952569,0.47070393216533257,0.88229122643495328,0.44838321609003223,0.89384142415126377,0.42577929156507266,0.90482705246601958,0.40290643571366269,0.91524117262091753,0.37977909552180111,0.92507720683445804,0.35641187871325075,0.93432894245661202,0.33281954452298668,0.94299053589286441,0.30901699437494745,0.95105651629515353,0.28501926246997616,0.95852178901737584,0.260841506289897,0.96538163883327388,0.23649899702372476,0.97163173291467386,0.21200710992205452,0.97726812356819348,0.18738131458572452,0.98228725072868872,0.1626371651948835,0.98668594420786804,0.13779029068463797,0.99046142569665119,0.1128563848734816,0.9936113105200084,0.087851196550743096,0.9961336091431725,0.062790519529313304,0.99802672842827156,0.037690182669934472,0.9992894726405892,0.012566039883352554,0.99992104420381611,0,0.9992894726405892,0.037690182669934541,0.99715890026061393,0.075326805527932722,0.9936113105200084,0.11285638487348168,0.98865174473791406,0.15022558912075706,0.98228725072868872,0.1873813145857246,0.97452687278657713,0.22427076094938117,0.96538163883327388,0.26084150628989694,0.95486454474664295,0.29704158157703492,0.94299053589286452,0.33281954452298662,0.92977648588825146,0.36812455268467792,0.91524117262091753,0.40290643571366264,0.89940525156637108,0.43711576665093288,0.88229122643495328,0.47070393216533252,0.86392341719283527,0.5036232016357608,0.84432792550201508,0.53582679497899666,0.82353259762842745,0.56726894912675652,0.80156698487087663,0.59790498305751882,0.77846230156702345,0.62769136129070047,0.75425138073610387,0.65658575575295641,0.72896862742141155,0.68454710592868862,0.70264996979884919,0.71153567720928534,0.67533280812102447,0.73751311735817393,0.64705596156944434,0.76244251101144789,0.61785961309033433,0.78628843213661892,0.58778525229247314,0.80901699437494745,0.55687561648818806,0.83059589919581256,0.52517462996129571,0.85099448179469184,0.49272734154829156,0.87018375466952569,0.45957986062148792,0.88813644881354448,0.42577929156507266,0.90482705246601958,0.39137366683720254,0.92023184736587027,0.35641187871325075,0.93432894245661202,0.32094360980720943,0.94709830499474434,0.28501926246997616,0.95852178901737584,0.24868988716485474,0.96858316112863108,0.21200710992205474,0.97726812356819348,0.17502305897527604,0.98456433452920533,0.13779029068463819,0.99046142569665119,0.10036171485121491,0.99495101698130017,0.062790519529313527,0.99802672842827156,0.025130095443337531,0.99968418928329994,-0.012566039883352653,0.99992104420381611,-0.050244318179769473,0.99873695660601747,-0.087851196550743194,0.9961336091431725,-0.12533323356430415,0.99211470131447788,-0.16263716519488358,0.98668594420786804,-0.19970998051440689,0.97985505238424686,-0.23649899702372465,0.97163173291467397,-0.27295193551732527,0.96202767158608593,-0.30901699437494734,0.95105651629515364,-0.34464292317451706,0.93873385765387407,-0.379779095521801,0.92507720683445804,-0.41437558099328414,0.91010597068499566,-0.44838321609003212,0.89384142415126389,-0.48175367410171505,0.87630668004386369,-0.51443953378150653,0.8575266561936522,-0.54639434673426901,0.83752804004214176,-0.57757270342226741,0.81633925071718405,-0.60793029769460549,0.79399039864783527,-0.63742398974868975,0.77051324277578925,-0.66601186743425156,0.74594114542418222,-0.69365330581280482,0.72030902488790705,0,0.99873695660601747,0.050244318179769556,0.99495101698130017,0.10036171485121489,0.98865174473791406,0.15022558912075706,0.97985505238424686,0.19970998051440703,0.96858316112863108,0.24868988716485479,0.95486454474664295,0.29704158157703492,0.93873385765387407,0.34464292317451706,0.92023184736587038,0.39137366683720243,0.89940525156637108,0.43711576665093288,0.87630668004386358,0.48175367410171532,0.85099448179469184,0.52517462996129571,0.82353259762842745,0.56726894912675652,0,0.99495101698130017,0.10036171485121489,0.97985505238424686,0.19970998051440703,0.95486454474664295,0.29704158157703492,0.92023184736587038,0.39137366683720243,0.87630668004386358,0.48175367410171532,0.82353259762842745,0.56726894912675652,0.76244251101144789,0.64705596156944434,0.69365330581280493,0.72030902488790682,0.61785961309033433,0.78628843213661892,0.53582679497899655,0.84432792550201508,0.44838321609003223,0.89384142415126377,0.35641187871325075,0.93432894245661202,0,0.98865174473791406,0.15022558912075706,0.95486454474664295,0.29704158157703492,0.89940525156637108,0.43711576665093288,0.82353259762842745,0.56726894912675652,0.72896862742141155,0.68454710592868862,0.61785961309033433,0.78628843213661892,0.49272734154829156,0.87018375466952569,0.35641187871325075,0.93432894245661202,0.21200710992205474,0.97726812356819348,0.062790519529313527,0.99802672842827156,-0.087851196550743194,0.9961336091431725,-0.23649899702372465,0.97163173291467397,0,0.97985505238424686,0.19970998051440703,0.92023184736587038,0.39137366683720243,0.82353259762842745,0.56726894912675652,0.69365330581280493,0.72030902488790682,0.53582679497899655,0.84432792550201508,0.35641187871325075,0.93432894245661202,0.1626371651948835,0.98668594420786804,-0.037690182669934576,0.9992894726405892,-0.23649899702372465,0.97163173291467397,-0.42577929156507272,0.90482705246601947,-0.59790498305751894,0.80156698487087652,-0.74594114542418211,0.66601186743425167,0,0.96858316112863108,0.24868988716485479,0.87630668004386358,0.48175367410171532,0,0.87630668004386358,0.48175367410171532,0.53582679497899655,0.84432792550201508,0,0.72896862742141155,0.68454710592868873,0.062790519529313304,0.99802672842827156,0,0.53582679497899655,0.84432792550201508,-0.42577929156507272,0.90482705246601947,0,0,0,0,0,0.9999654630763769,0.0083109959960970241,0.99986185469110567,0.016621417919726152,0.99968918200081625,0.024930691738072875,0.99944745693267556,0.033238243497626739,0.99913669618356415,0.041543499363826515,0.99875692121892234,0.049845885660697163,0.99830815827126818,0.058144828910475829,0.99779043833838499,0.066439755873224177,0.99720379718118013,0.074730093586424254,0.99654827532121548,0.083015269404555239,0.99582391803790782,0.091294711038648294,0.99503077536540141,0.099567846595816661,0.99416890208911213,0.10783410461875863,0.99323835774194302,0.11609291412523023,0.99223920660017206,0.12434370464748516,0.99117151767901279,0.13258590627167927,0.99003536472784648,0.14081894967723654,0.98883082622512852,0.14904226617617444,0.98755798537296757,0.15725528775238523,0.98621693009137823,0.16545744710087118,0.98480775301220802,0.17364817766693033,0.9833305514727394,0.18182691368529075,0.9817854275089658,0.18999309021918998,0.98017248784854383,0.19814614319939758,0.97849184390342125,0.20628550946317739,0.9767436117621412,0.21441062679318743,0.97492791218182362,0.22252093395631439,0.97304487057982381,0.23061587074244017,0.97109461702506994,0.23869487800313774,0.96907728622907796,0.24675739769029362,0.96699301753664724,0.25480287289465464,0.96484195491623492,0.26283074788429533,0.96262424695001203,0.27084046814300511,0.96034004682359986,0.27883148040859029,0.9579895123154889,0.28680323271109021,0.95557280578614068,0.29475517441090421,0.95309009416677304,0.30268675623682589,0.95054154894782905,0.31059743032398374,0.94792734616713181,0.31848665025168443,0.94524766639772484,0.3263538710811556,0.94250269473539927,0.33419854939318755,0.93969262078590843,0.34202014332566871,0.93681763865187095,0.3498181126110147,0.93387794691936366,0.35759191861348627,0.93087374864420425,0.36534102436639498,0.92780525133792546,0.3730648946091939,0.92467266695344152,0.38076299582444956,0.92147621187040762,0.38843479627469474,0.918216106880274,0.39607976603915679,0.91489257717103467,0.40369737705036218,0.91150585231167314,0.41128710313061156,0.90805616623630503,0.41884842002832484,0.90454375722801916,0.42638080545425383,0.90096886790241915,0.43388373911755812,0.89733174519086401,0.44135670276174394,0.89363264032341228,0.44879918020046217,0.88987180881146866,0.45621065735316296,0.88604951043013436,0.46359062228060566,0.88216600920026411,0.4709385652202201,0.87822157337022855,0.47825397862131819,0.87421647539738567,0.48553635718015209,0.87015099192926093,0.49278519787481767,0.86602540378443871,0.49999999999999994,0.86183999593316396,0.50718026520155923,0.85759505747765952,0.51432549751095358,0.85329088163215572,0.521435203379498,0.84892776570263739,0.52850889171245541,0.84450601106630785,0.5355460739029585,0.8400259231507714,0.54254626386575944,0.83548781141293649,0.54950897807080601,0.83089198931763975,0.556433735576641,0.82623877431599491,0.56332005806362206,0.82152848782346399,0.57016746986696165,0.81676145519765675,0.57697549800958292,0.8119380057158565,0.58374367223478985,0.80705847255227614,0.59047152503874989,0.80212319275504385,0.59715859170278618,0.7971325072229225,0.60380441032547738,0.7920867606817622,0.61040852185456318,0.78698630166068895,0.61697047011865247,0.7818314824680298,0.62348980185873348,0.77662265916697837,0.6299660667594813,0.77136019155099977,0.63639881748036342,0.76604444311897801,0.64278760968653925,0.76067578105010858,0.64913200207955191,0.75525457617853486,0.65543155642781015,0.74978120296773421,0.66168583759685939,0.74425603948465158,0.66789441357943746,0.73867946737358559,0.67405685552531536,0.73305187182982634,0.68017273777091936,0.72737364157304873,0.6862416378687336,0.72164516882046204,0.69226313661647965,0.71586684925971844,0.69823681808607274,0.71003908202158039,0.70416226965235185,0,0.99986185469110567,0.016621417919726152,0.99944745693267556,0.033238243497626739,0.99875692121892234,0.049845885660697163,0.99779043833838499,0.066439755873224177,0.99654827532121548,0.083015269404555239,0.99503077536540141,0.099567846595816661,0.99323835774194302,0.11609291412523023,0.99117151767901279,0.13258590627167927,0.98883082622512852,0.14904226617617444,0.98621693009137823,0.16545744710087118,0.9833305514727394,0.18182691368529075,0.98017248784854383,0.19814614319939758,0.9767436117621412,0.21441062679318743,0.97304487057982381,0.23061587074244017,0.96907728622907796,0.24675739769029362,0.96484195491623492,0.26283074788429533,0.96034004682359986,0.27883148040859029,0.95557280578614068,0.29475517441090421,0.95054154894782905,0.31059743032398374,0.94524766639772484,0.3263538710811556,0.93969262078590843,0.34202014332566871,0.93387794691936366,0.35759191861348627,0.92780525133792546,0.3730648946091939,0.92147621187040762,0.38843479627469474,0.91489257717103467,0.40369737705036218,0.90805616623630503,0.41884842002832484,0.90096886790241915,0.43388373911755812,0.89363264032341228,0.44879918020046217,0.88604951043013436,0.46359062228060566,0.87822157337022855,0.47825397862131819,0.87015099192926093,0.49278519787481767,0.86183999593316396,0.50718026520155923,0.85329088163215572,0.521435203379498,0.84450601106630785,0.5355460739029585,0.83548781141293649,0.54950897807080601,0.82623877431599491,0.56332005806362206,0.81676145519765675,0.57697549800958292,0.80705847255227614,0.59047152503874989,0.7971325072229225,0.60380441032547738,0.78698630166068895,0.61697047011865247,0.77662265916697837,0.6299660667594813,0.76604444311897801,0.64278760968653925,0.75525457617853486,0.65543155642781015,0.74425603948465158,0.66789441357943746,0.73305187182982634,0.68017273777091936,0.72164516882046204,0.69226313661647965,0.71003908202158039,0.70416226965235185,0.69823681808607285,0.71586684925971844,0.6862416378687336,0.72737364157304873,0.67405685552531536,0.73867946737358559,0.66168583759685939,0.74978120296773421,0.64913200207955191,0.76067578105010847,0.63639881748036342,0.77136019155099977,0.62348980185873359,0.7818314824680298,0.61040852185456318,0.7920867606817622,0.59715859170278618,0.80212319275504373,0.58374367223478996,0.8119380057158565,0.57016746986696165,0.82152848782346399,0.556433735576641,0.83089198931763975,0.54254626386575944,0.8400259231507714,0.52850889171245552,0.84892776570263739,0.51432549751095358,0.85759505747765952,0.50000000000000011,0.8660254037844386,0.48553635718015214,0.87421647539738556,0.4709385652202201,0.88216600920026411,0.45621065735316307,0.88987180881146855,0.44135670276174405,0.89733174519086389,0.42638080545425383,0.90454375722801916,0.41128710313061151,0.91150585231167314,0.3960797660391569,0.918216106880274,0.38076299582444961,0.92467266695344152,0.36534102436639498,0.93087374864420425,0.34981811261101486,0.93681763865187084,0.33419854939318761,0.94250269473539927,0.31848665025168443,0.94792734616713181,0.30268675623682606,0.95309009416677304,0.28680323271109032,0.9579895123154889,0.27084046814300516,0.96262424695001203,0.25480287289465459,0.96699301753664724,0.23869487800313785,0.97109461702506983,0.22252093395631445,0.97492791218182362,0.20628550946317739,0.97849184390342125,0.18999309021919011,0.9817854275089658,0.17364817766693041,0.98480775301220802,0.15725528775238529,0.98755798537296757,0.14081894967723671,0.99003536472784637,0.12434370464748527,0.99223920660017206,0.10783410461875867,0.99416890208911213,0.091294711038648266,0.99582391803790782,0.074730093586424393,0.99720379718118013,0.058144828910475899,0.99830815827126818,0.041543499363826522,0.99913669618356415,0.024930691738073035,0.99968918200081625,0.0083109959960971196,0.9999654630763769,0,0.99968918200081625,0.024930691738072875,0.99875692121892234,0.049845885660697163,0.99720379718118013,0.074730093586424254,0.99503077536540141,0.099567846595816661,0.99223920660017206,0.12434370464748518,0.98883082622512852,0.14904226617617444,0.98480775301220802,0.17364817766693036,0.98017248784854383,0.19814614319939758,0.97492791218182362,0.22252093395631439,0.96907728622907796,0.24675739769029365,0.96262424695001203,0.27084046814300511,0.95557280578614068,0.29475517441090421,0.94792734616713181,0.31848665025168443,0.93969262078590832,0.34202014332566877,0.93087374864420425,0.36534102436639504,0.92147621187040762,0.38843479627469474,0.91150585231167314,0.41128710313061156,0.90096886790241915,0.43388373911755812,0.88987180881146855,0.45621065735316302,0.87822157337022855,0.47825397862131824,0.8660254037844386,0.5,0.85329088163215561,0.52143520337949811,0.8400259231507714,0.54254626386575944,0.82623877431599491,0.56332005806362206,0.8119380057158565,0.58374367223478985,0.7971325072229225,0.60380441032547738,0.7818314824680298,0.62348980185873348,0.76604444311897801,0.64278760968653936,0.74978120296773421,0.66168583759685951,0.73305187182982634,0.68017273777091947,0.71586684925971844,0.69823681808607285,0.69823681808607285,0.71586684925971844,0.68017273777091936,0.73305187182982634,0.66168583759685939,0.74978120296773421,0.64278760968653936,0.76604444311897801,0.62348980185873359,0.7818314824680298,0.60380441032547727,0.7971325072229225,0.58374367223478985,0.8119380057158565,0.56332005806362195,0.82623877431599491,0.54254626386575944,0.84002592315077151,0.521435203379498,0.85329088163215572,0.49999999999999989,0.86602540378443871,0.47825397862131824,0.87822157337022855,0.45621065735316291,0.88987180881146866,0.43388373911755818,0.90096886790241915,0.41128710313061151,0.91150585231167314,0.38843479627469479,0.92147621187040762,0.36534102436639498,0.93087374864420425,0.3420201433256686,0.93969262078590843,0.31848665025168443,0.94792734616713181,0.2947551744109041,0.95557280578614079,0.27084046814300516,0.96262424695001203,0.24675739769029356,0.96907728622907796,0.22252093395631445,0.97492791218182362,0.19814614319939755,0.98017248784854383,0.17364817766693022,0.98480775301220813,0.14904226617617444,0.98883082622512852,0.12434370464748506,0.99223920660017206,0.099567846595816661,0.99503077536540141,0.074730093586424171,0.99720379718118013,0.049845885660697198,0.99875692121892234,0.024930691738072813,0.99968918200081625,6.123233995736766e-17,1,-0.024930691738072913,0.99968918200081625,-0.049845885660697295,0.99875692121892234,-0.074730093586424268,0.99720379718118013,-0.099567846595816759,0.99503077536540141,-0.12434370464748516,0.99223920660017206,-0.14904226617617453,0.98883082622512852,-0.1736481776669303,0.98480775301220802,-0.19814614319939763,0.98017248784854383,-0.22252093395631434,0.97492791218182362,-0.24675739769029367,0.96907728622907796,-0.27084046814300522,0.96262424695001203,-0.29475517441090421,0.95557280578614068,-0.31848665025168454,0.9479273461671317,-0.34202014332566871,0.93969262078590843,-0.3653410243663951,0.93087374864420425,-0.38843479627469468,0.92147621187040762,-0.41128710313061156,0.91150585231167314,-0.43388373911755806,0.90096886790241915,-0.45621065735316296,0.88987180881146855,-0.4782539786213183,0.87822157337022844,-0.50000000000000022,0.8660254037844386,-0.521435203379498,0.85329088163215572,-0.54254626386575944,0.84002592315077151,-0.56332005806362206,0.82623877431599491,-0.58374367223478996,0.81193800571585639,-0.6038044103254776,0.79713250722292239,-0.62348980185873348,0.78183148246802991,-0.64278760968653936,0.76604444311897801,-0.66168583759685951,0.7497812029677341,-0.68017273777091958,0.73305187182982623,-0.69823681808607274,0.71586684925971855,0,0.99944745693267556,0.033238243497626739,0.99779043833838499,0.066439755873224177,0.99503077536540141,0.099567846595816661,0.99117151767901279,0.13258590627167927,0.98621693009137823,0.16545744710087118,0.98017248784854383,0.19814614319939758,0.97304487057982381,0.23061587074244017,0.96484195491623492,0.26283074788429533,0.95557280578614068,0.29475517441090421,0.94524766639772484,0.3263538710811556,0.93387794691936366,0.35759191861348627,0.92147621187040762,0.38843479627469474,0.90805616623630503,0.41884842002832484,0.89363264032341228,0.44879918020046217,0.87822157337022855,0.47825397862131819,0.86183999593316396,0.50718026520155923,0.84450601106630785,0.5355460739029585,0.82623877431599491,0.56332005806362206,0.80705847255227614,0.59047152503874989,0.78698630166068895,0.61697047011865247,0.76604444311897801,0.64278760968653925,0.74425603948465158,0.66789441357943746,0.72164516882046204,0.69226313661647965,0.69823681808607285,0.71586684925971844,0.67405685552531536,0.73867946737358559,0.64913200207955191,0.76067578105010847,0.62348980185873359,0.7818314824680298,0.59715859170278618,0.80212319275504373,0.57016746986696165,0.82152848782346399,0.54254626386575944,0.8400259231507714,0.51432549751095358,0.85759505747765952,0,0.99779043833838499,0.066439755873224177,0.99117151767901279,0.13258590627167927,0.98017248784854383,0.19814614319939758,0.96484195491623492,0.26283074788429533,0.94524766639772484,0.3263538710811556,0.92147621187040762,0.38843479627469474,0.89363264032341228,0.44879918020046217,0.86183999593316396,0.50718026520155923,0.82623877431599491,0.56332005806362206,0.78698630166068895,0.61697047011865247,0.74425603948465158,0.66789441357943746,0.69823681808607285,0.71586684925971844,0.64913200207955191,0.76067578105010847,0.59715859170278618,0.80212319275504373,0.54254626386575944,0.8400259231507714,0.48553635718015214,0.87421647539738556,0.42638080545425383,0.90454375722801916,0.36534102436639498,0.93087374864420425,0.30268675623682606,0.95309009416677304,0.23869487800313785,0.97109461702506983,0.17364817766693041,0.98480775301220802,0.10783410461875867,0.99416890208911213,0.041543499363826522,0.99913669618356415,-0.024930691738072913,0.99968918200081625,-0.091294711038648141,0.99582391803790782,-0.15725528775238515,0.98755798537296757,-0.22252093395631434,0.97492791218182362,-0.28680323271109021,0.9579895123154889,-0.34981811261101475,0.93681763865187095,-0.4112871031306114,0.91150585231167325,-0.47093856522022021,0.88216600920026411,0,0.99503077536540141,0.099567846595816661,0.98017248784854383,0.19814614319939758,0.95557280578614068,0.29475517441090421,0.92147621187040762,0.38843479627469474,0.87822157337022855,0.47825397862131824,0.82623877431599491,0.56332005806362206,0.76604444311897801,0.64278760968653936,0.69823681808607285,0.71586684925971844,0.62348980185873359,0.7818314824680298,0.54254626386575944,0.84002592315077151,0,0.98017248784854383,0.19814614319939758,0.92147621187040762,0.38843479627469474,0.82623877431599491,0.56332005806362206,0.69823681808607285,0.71586684925971844,0.54254626386575944,0.84002592315077151,0.36534102436639498,0.93087374864420425,0.17364817766693022,0.98480775301220813,-0.024930691738072913,0.99968918200081625,-0.22252093395631434,0.97492791218182362,-0.41128710313061156,0.91150585231167314,0,0.95557280578614068,0.29475517441090421,0.82623877431599491,0.56332005806362206,0.62348980185873359,0.7818314824680298,0,0.82623877431599491,0.56332005806362206,0.36534102436639498,0.93087374864420425,-0.22252093395631434,0.97492791218182362,0,0,0,0,0,0,0]} diff --git a/lib/node_modules/@stdlib/fft/base/fftpack/rffti/test/fixtures/c/fftpack/medium.json b/lib/node_modules/@stdlib/fft/base/fftpack/rffti/test/fixtures/c/fftpack/medium.json new file mode 100644 index 000000000000..215106655dfe --- /dev/null +++ b/lib/node_modules/@stdlib/fft/base/fftpack/rffti/test/fixtures/c/fftpack/medium.json @@ -0,0 +1 @@ +{"lengths":[58,74,109,19,21,75,91,16,58,23],"offsets":[0,57,130,238,256,276,350,440,455,512],"twiddles":[0.9941379571543596,0.10811901842394177,0.97662055571008666,0.21497044021102407,0.94765317118280246,0.31930153013598001,0.90757541967095701,0.4198891015602646,0.85685717616758927,0.51555385717702173,0.79609306570564375,0.60517421519376513,0.72599549192313084,0.68769945885342332,0.64738628478182758,0.76216205512763646,0.56118706536238228,0.82768899815689057,0.46840844069979015,0.88351204444602294,0.37013815533991434,0.92897671981679142,0.26752833852922075,0.96354999251922302,0.16178199655276462,0.98682652254152614,0.05413890858541761,0.99853341385112382,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.99639748854252652,0.084805924475509192,0.98561591034770846,0.16900082032184907,0.96773294693349887,0.25197806138512518,0.94287744546108421,0.33313979474205757,0.91122849038813569,0.4119012482439926,0.87301411316118815,0.48769494381363454,0.82850964924384218,0.55997478613759533,0.77803575431843952,0.62821999729564226,0.72195609395452454,0.69193886897754608,0.66067472339008149,0.75067230525272433,0.59463317630428669,0.80399713036694054,0.52430728355723166,0.85152913773331129,0.45020374481767328,0.89292585814956849,0.37285647778030861,0.92788902729650935,0.29282277127655043,0.95616673473925096,0.21067926999572642,0.97755523894768614,0.12701781974687887,0.99190043525887683,0.042441203196148462,0.99909896620468142,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.95557280578614068,0.29475517441090421,0.82623877431599491,0.56332005806362206,0.62348980185873359,0.7818314824680298,0,0.82623877431599491,0.56332005806362206,0.36534102436639498,0.93087374864420425,-0.22252093395631434,0.97492791218182362,0,0,0,0,0,0,0,0.99649285924950437,0.083677843332315482,0.98599603707050498,0.16676874671610226,0.96858316112863119,0.24868988716485474,0.94437637023748111,0.32886664673858318,0.91354545764260087,0.40673664307580015,0.87630668004386358,0.48175367410171521,0.83292124071009954,0.55339154924334399,0.78369345732583984,0.6211477802783103,0.72896862742141155,0.68454710592868862,0.66913060635885824,0.74314482547739424,0.60459911486237494,0.79652991802419626,0.53582679497899677,0.84432792550201496,0,0.98599603707050498,0.16676874671610226,0.94437637023748111,0.32886664673858318,0.87630668004386358,0.48175367410171521,0.78369345732583984,0.6211477802783103,0.66913060635885824,0.74314482547739424,0.53582679497899677,0.84432792550201496,0.3875155864521031,0.92186315158850052,0.22835087011065588,0.97357890287316018,0.062790519529313527,0.99802672842827156,-0.10452846326765333,0.9945218953682734,-0.26891982061526559,0.96316256679765822,-0.42577929156507233,0.90482705246601969,0,0.96858316112863119,0.24868988716485474,0.87630668004386358,0.48175367410171521,0,0.87630668004386358,0.48175367410171521,0.53582679497899677,0.84432792550201496,0,0.72896862742141155,0.68454710592868862,0.062790519529313527,0.99802672842827156,0,0.53582679497899677,0.84432792550201496,-0.42577929156507233,0.90482705246601969,0,0,0,0,0,0.99761727230124764,0.068991144404324925,0.99048044398756319,0.13765351458716821,0.97862352529595531,0.20565990308593657,0.96210301984360058,0.27268622848949375,0.94099765536237645,0.33841307983367042,0.91540800852536641,0.40252723873996749,0,0.99048044398756319,0.13765351458716821,0.96210301984360058,0.27268622848949375,0.91540800852536641,0.40252723873996749,0.85128444158435124,0.52470448779900802,0.7709531747949796,0.63689182933488919,0.67594364414475439,0.73695331598433667,0,0.97862352529595531,0.20565990308593657,0.91540800852536641,0.40252723873996749,0.81305609947853252,0.58218534772077069,0.67594364414475439,0.73695331598433667,0.50993260439013599,0.86021435641350064,0.32212044179849075,0.94669869598280587,0,0.96210301984360058,0.27268622848949375,0.85128444158435124,0.52470448779900802,0.67594364414475439,0.73695331598433667,0.44937040096716135,0.89334553378556314,0.18873759545291671,0.98202755565343036,-0.086200379880619196,0.99627781994202647,0,0.94099765536237645,0.33841307983367042,0.7709531747949796,0.63689182933488919,0.50993260439013577,0.86021435641350075,0.18873759545291671,0.98202755565343036,-0.15472933479028111,0.98795689832874645,-0.47993747795978653,0.87730269419944185,0,0.91540800852536641,0.40252723873996749,0.67594364414475439,0.73695331598433667,0.32212044179849075,0.94669869598280587,-0.086200379880619196,0.99627781994202647,-0.47993747795978614,0.87730269419944207,-0.79247684195109025,0.60990200440007303,0,0,0,0,0,0,0,0,0,0,0,0,0,0.92387953251128674,0.38268343236508978,0,0,0.70710678118654757,0.70710678118654746,0,0,0.38268343236508984,0.92387953251128674,0,0,0,0,0,0.9941379571543596,0.10811901842394177,0.97662055571008666,0.21497044021102407,0.94765317118280246,0.31930153013598001,0.90757541967095701,0.4198891015602646,0.85685717616758927,0.51555385717702173,0.79609306570564375,0.60517421519376513,0.72599549192313084,0.68769945885342332,0.64738628478182758,0.76216205512763646,0.56118706536238228,0.82768899815689057,0.46840844069979015,0.88351204444602294,0.37013815533991434,0.92897671981679142,0.26752833852922075,0.96354999251922302,0.16178199655276462,0.98682652254152614,0.05413890858541761,0.99853341385112382,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]} diff --git a/lib/node_modules/@stdlib/fft/base/fftpack/rffti/test/fixtures/c/fftpack/runner.c b/lib/node_modules/@stdlib/fft/base/fftpack/rffti/test/fixtures/c/fftpack/runner.c new file mode 100644 index 000000000000..82f5947a89b0 --- /dev/null +++ b/lib/node_modules/@stdlib/fft/base/fftpack/rffti/test/fixtures/c/fftpack/runner.c @@ -0,0 +1,282 @@ +/** +* @license Apache-2.0 +* +* Copyright (c) 2026 The Stdlib Authors. +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +/** +* Generate FFTPACK test fixtures. +* +* ## Notes +* +* - Run this script from the directory in which fixtures should be written. +* +*/ + +#include +#include + +/** +* Define prototypes for external functions. +*/ +extern void rffti( int n, double *wsave ); + +/** +* Generates a random number on the interval [0,1]. +* +* @return random number +*/ +double rand_double( void ) { + int r = rand(); + return (double)r / ( (double)RAND_MAX + 1.0 ); +} + +/** +* Generates an array of pseudorandom integers drawn from a uniform distribution. +* +* ## Notes +* +* - WARNING: the method used here is not particularly robust, as some integer values may be sampled more frequently than others. +* +* +* @param out output array +* @param len array length +* @param a lower bound (inclusive) +* @param b upper bound (exclusive) +*/ +void rand_array_i32( int *out, const unsigned int len, const int a, const int b ) { + unsigned int i; + unsigned int r; + double delta; + + delta = (double)b - (double)a; + + for ( i = 0; i < len; i++ ) { + r = (unsigned int)( delta * rand_double() ); // truncation + out[ i ] = (int)( a + r ); + } +} + +/** +* Writes an array of doubles to a file as a series of comma-separated values. +* +* @param f file to write to +* @param x array of doubles +* @param len array length +*/ +void write_array_f64( FILE *f, const double *x, const unsigned int len ) { + unsigned int i; + + for ( i = 0; i < len; i++ ) { + fprintf( f, "%.17g", x[ i ] ); + if ( i < len-1 ) { + fprintf( f, "," ); + } + } +} + +/** +* Writes an array of integers to a file as a series of comma-separated values. +* +* @param f file to write to +* @param x array of integers +* @param len array length +*/ +void write_array_i32( FILE *f, const int *x, const unsigned int len ) { + unsigned int i; + + for ( i = 0; i < len; i++ ) { + fprintf( f, "%d", x[ i ] ); + if ( i < len-1 ) { + fprintf( f, "," ); + } + } +} + +/** +* Writes a named array of doubles to a file as JSON. +* +* @param f file to write to +* @param name array name +* @param x data +* @param len array length +*/ +void write_named_array_f64( FILE *f, const char *name, const double *x, const unsigned int len ) { + fprintf( f, "\"%s\":[", name ); + write_array_f64( f, x, len ); + fprintf( f, "]" ); +} + +/** +* Writes a named array of integers to a file as JSON. +* +* @param f file to write to +* @param name array name +* @param x data +* @param len array length +*/ +void write_named_array_i32( FILE *f, const char *name, const int *x, const unsigned int len ) { + fprintf( f, "\"%s\":[", name ); + write_array_i32( f, x, len ); + fprintf( f, "]" ); +} + +/** +* Writes data to a file as JSON. +* +* ## Notes +* +* - This function SHOULD be tailored to the input data (e.g., input types, output types, number of arguments, etc) and may vary from use case to use case. +* +* +* @param f file to write to +* @param lengths sequence lengths +* @param offsets twiddle offsets +* @param twiddles twiddle factors +* @param num number of sequence lengths +* @param total total number of twiddle values +*/ +void write_data_as_json( FILE *f, const int *lengths, const int *offsets, const double *twiddles, const unsigned int num, const unsigned int total ) { + fprintf( f, "{" ); + write_named_array_i32( f, "lengths", lengths, num ); + fprintf( f, "," ); + write_named_array_i32( f, "offsets", offsets, num ); + fprintf( f, "," ); + write_named_array_f64( f, "twiddles", twiddles, total ); + fprintf( f, "}\n" ); +} + +/** +* Generates test fixtures. +* +* @param lengths sequence lengths +* @param offsets twiddle offsets into flat output array +* @param num number of sequence lengths +* @param total total number of twiddle values +* @param name output filename +*/ +void generate( const int *lengths, const int *offsets, const unsigned int num, const unsigned int total, const char *name ) { + unsigned int i; + unsigned int j; + double *twiddles; + double *wsave; + FILE *f; + int off; + int n; + + // Allocate an output array: + twiddles = (double*) malloc( total * sizeof(double) ); + if ( twiddles == NULL ) { + printf( "Error allocating memory.\n" ); + exit( 1 ); + } + + // Generate fixture data: + for ( i = 0; i < num; i++ ) { + n = lengths[ i ]; + wsave = (double*) calloc( 2*n + 15, sizeof(double) ); + if ( wsave == NULL ) { + printf( "Error allocating memory.\n" ); + exit( 1 ); + } + rffti( n, wsave ); + + // Copy twiddle region into flat array (N-1 values starting at wsave[n]): + off = offsets[ i ]; + for ( j = 0; j < (unsigned int)( n - 1 ); j++ ) { + twiddles[ off + j ] = wsave[ n + j ]; + } + free( wsave ); + } + // Open a new file: + f = fopen( name, "w" ); + if ( f == NULL ) { + printf( "Error opening file.\n" ); + exit( 1 ); + } + + // Write data as JSON: + write_data_as_json( f, lengths, offsets, twiddles, num, total ); + + // Close the file: + fclose( f ); + + // Free allocated memory: + free( twiddles ); +} + +/** +* Computes offsets into a flat twiddle array for each sequence length. +* +* @param offsets output array of offsets +* @param lengths sequence lengths +* @param num number of sequence lengths +* @return total number of twiddle values +*/ +unsigned int compute_offsets( int *offsets, const int *lengths, const unsigned int num ) { + unsigned int total; + unsigned int i; + + total = 0; + for ( i = 0; i < num; i++ ) { + offsets[ i ] = total; + total += lengths[ i ] - 1; + } + return total; +} + +/** +* Main execution sequence. +*/ +int main( void ) { + unsigned int total; + unsigned int num; + int *lengths; + int *offsets; + + // Define the number of sequence lengths per range: + num = 10; + + // Allocate arrays: + lengths = (int*) malloc( num * sizeof(int) ); + if ( lengths == NULL ) { + printf( "Error allocating memory.\n" ); + exit( 1 ); + } + offsets = (int*) malloc( num * sizeof(int) ); + if ( offsets == NULL ) { + printf( "Error allocating memory.\n" ); + exit( 1 ); + } + + // Generate fixture data: + rand_array_i32( lengths, num, 2, 16 ); + total = compute_offsets( offsets, lengths, num ); + generate( lengths, offsets, num, total, "small.json" ); + + rand_array_i32( lengths, num, 16, 128 ); + total = compute_offsets( offsets, lengths, num ); + generate( lengths, offsets, num, total, "medium.json" ); + + rand_array_i32( lengths, num, 128, 1024 ); + total = compute_offsets( offsets, lengths, num ); + generate( lengths, offsets, num, total, "large.json" ); + + // Free allocated memory: + free( lengths ); + free( offsets ); + + return 0; +} diff --git a/lib/node_modules/@stdlib/fft/base/fftpack/rffti/test/fixtures/c/fftpack/small.json b/lib/node_modules/@stdlib/fft/base/fftpack/rffti/test/fixtures/c/fftpack/small.json new file mode 100644 index 000000000000..519a16fcee1e --- /dev/null +++ b/lib/node_modules/@stdlib/fft/base/fftpack/rffti/test/fixtures/c/fftpack/small.json @@ -0,0 +1 @@ +{"lengths":[2,3,12,8,9,5,2,11,11,15],"offsets":[0,1,3,14,21,29,33,34,44,54],"twiddles":[0,0,0,0.86602540378443871,0.49999999999999994,0,0.50000000000000011,0.8660254037844386,0,6.123233995736766e-17,1,0,0,0,0.70710678118654757,0.70710678118654746,0,0,0,0,0,0.76604444311897801,0.64278760968653925,0,0.17364817766693041,0.98480775301220802,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.91354545764260087,0.40673664307580015,0.66913060635885824,0.74314482547739424,0,0.66913060635885824,0.74314482547739424,-0.10452846326765333,0.9945218953682734,0,0,0,0,0]} diff --git a/lib/node_modules/@stdlib/fft/base/fftpack/rffti/test/test.js b/lib/node_modules/@stdlib/fft/base/fftpack/rffti/test/test.js new file mode 100644 index 000000000000..88262f7c17b1 --- /dev/null +++ b/lib/node_modules/@stdlib/fft/base/fftpack/rffti/test/test.js @@ -0,0 +1,231 @@ +/** +* @license Apache-2.0 +* +* Copyright (c) 2026 The Stdlib Authors. +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +'use strict'; + +// MODULES // + +var tape = require( 'tape' ); +var Float64Array = require( '@stdlib/array/float64' ); +var abs = require( '@stdlib/math/base/special/abs' ); +var EPS = require( '@stdlib/constants/float64/eps' ); +var rffti = require( './../lib' ); + + +// FIXTURES // + +var small = require( './fixtures/c/fftpack/small.json' ); +var medium = require( './fixtures/c/fftpack/medium.json' ); +var large = require( './fixtures/c/fftpack/large.json' ); + + +// TESTS // + +tape( 'main export is a function', function test( t ) { + t.ok( true, __filename ); + t.strictEqual( typeof rffti, 'function', 'main export is a function' ); + t.end(); +}); + +tape( 'the function has an arity of 4', function test( t ) { + t.strictEqual( rffti.length, 4, 'returns expected value' ); + t.end(); +}); + +tape( 'the function correctly initializes twiddle factors (small sequence lengths)', function test( t ) { + var workspace; + var expected; + var lengths; + var offsets; + var delta; + var tol; + var off; + var y; + var N; + var i; + var k; + + lengths = small.lengths; + offsets = small.offsets; + expected = small.twiddles; + + for ( k = 0; k < lengths.length; k++ ) { + N = lengths[ k ]; + off = offsets[ k ]; + workspace = new Float64Array( ( 2*N ) + 34 ); + rffti( N, workspace, 1, 0 ); + + t.strictEqual( workspace[ N ], 0.0, 'returns expected value' ); + for ( i = 0; i < N-1; i++ ) { + y = workspace[ N+i+1 ]; + if ( y === expected[ off+i ] ) { + t.strictEqual( y, expected[ off+i ], 'returns expected value' ); + } else { + delta = abs( y - expected[ off+i ] ); + tol = EPS * abs( expected[ off+i ] ); + t.ok( delta <= tol, 'within tolerance. N: '+N+'. workspace['+(N+i+1)+']. Value: '+y+'. Expected: '+expected[off+i]+'. tol: '+tol+'. delta: '+delta+'.' ); + } + } + } + t.end(); +}); + +tape( 'the function correctly initializes twiddle factors (medium sequence lengths)', function test( t ) { + var workspace; + var expected; + var lengths; + var offsets; + var delta; + var tol; + var off; + var y; + var N; + var i; + var k; + + lengths = medium.lengths; + offsets = medium.offsets; + expected = medium.twiddles; + + for ( k = 0; k < lengths.length; k++ ) { + N = lengths[ k ]; + off = offsets[ k ]; + workspace = new Float64Array( ( 2*N ) + 34 ); + rffti( N, workspace, 1, 0 ); + + t.strictEqual( workspace[ N ], 0.0, 'returns expected value' ); + for ( i = 0; i < N-1; i++ ) { + y = workspace[ N+i+1 ]; + if ( y === expected[ off+i ] ) { + t.strictEqual( y, expected[ off+i ], 'returns expected value' ); + } else { + delta = abs( y - expected[ off+i ] ); + tol = EPS * abs( expected[ off+i ] ); + t.ok( delta <= tol, 'within tolerance. N: '+N+'. workspace['+(N+i+1)+']. Value: '+y+'. Expected: '+expected[off+i]+'. tol: '+tol+'. delta: '+delta+'.' ); + } + } + } + t.end(); +}); + +tape( 'the function correctly initializes twiddle factors (large sequence lengths)', function test( t ) { + var workspace; + var expected; + var lengths; + var offsets; + var delta; + var tol; + var off; + var y; + var N; + var i; + var k; + + lengths = large.lengths; + offsets = large.offsets; + expected = large.twiddles; + + for ( k = 0; k < lengths.length; k++ ) { + N = lengths[ k ]; + off = offsets[ k ]; + workspace = new Float64Array( ( 2*N ) + 34 ); + rffti( N, workspace, 1, 0 ); + + t.strictEqual( workspace[ N ], 0.0, 'returns expected value' ); + for ( i = 0; i < N-1; i++ ) { + y = workspace[ N+i+1 ]; + if ( y === expected[ off+i ] ) { + t.strictEqual( y, expected[ off+i ], 'returns expected value' ); + } else { + delta = abs( y - expected[ off+i ] ); + tol = EPS * abs( expected[ off+i ] ); + t.ok( delta <= tol, 'within tolerance. N: '+N+'. workspace['+(N+i+1)+']. Value: '+y+'. Expected: '+expected[off+i]+'. tol: '+tol+'. delta: '+delta+'.' ); + } + } + } + t.end(); +}); + +tape( 'the function does not modify the scratch region of the workspace', function test( t ) { + var workspace; + var N; + var i; + + N = 8; + workspace = new Float64Array( ( 2*N ) + 34 ); + + for ( i = 0; i < workspace.length; i++ ) { + workspace[ i ] = i + 1.0; + } + rffti( N, workspace, 1, 0 ); + for ( i = 0; i < N; i++ ) { + t.strictEqual( workspace[ i ], i + 1.0, 'returns expected value' ); + } + t.end(); +}); + +tape( 'the function does not modify the workspace when N is 1', function test( t ) { + var workspace; + var expected; + var N; + var i; + + N = 1; + workspace = new Float64Array( ( 2*N ) + 34 ); + for ( i = 0; i < workspace.length; i++ ) { + workspace[ i ] = i + 1.0; + } + expected = new Float64Array( workspace ); + + rffti( N, workspace, 1, 0 ); + + t.deepEqual( workspace, expected, 'returns expected value' ); + t.end(); +}); + +tape( 'the function correctly handles stride and offset parameters', function test( t ) { + var workspace; + var expected; + var stride; + var offset; + var nf; + var N; + var i; + + N = 8; + stride = 2; + offset = 3; + workspace = new Float64Array( offset + ( ( ( 2*N ) + 34 ) * stride ) ); + + rffti( N, workspace, stride, offset ); + + t.strictEqual( workspace[ offset + ( 2*N * stride ) ], N, 'returns expected value' ); + + nf = workspace[ offset + ( ( ( 2*N ) + 1 ) * stride ) ]; + t.strictEqual( nf, 2, 'returns expected value' ); + t.strictEqual( workspace[ offset + ( ( ( 2*N ) + 2 ) * stride ) ], 2, 'returns expected value' ); + t.strictEqual( workspace[ offset + ( ( ( 2*N ) + 3 ) * stride ) ], 4, 'returns expected value' ); + + expected = new Float64Array( ( 2*N ) + 34 ); + rffti( N, expected, 1, 0 ); + + for ( i = 0; i < N-1; i++ ) { + t.strictEqual( workspace[ offset + ( ( N+i+1 ) * stride ) ], expected[ N+i+1 ], 'returns expected value' ); + } + t.end(); +});