From 64521f6747577e01ef44702c6d43917a1aec3d2d Mon Sep 17 00:00:00 2001 From: Agnes Leroy Date: Wed, 20 Oct 2021 09:34:57 +0200 Subject: [PATCH] feat(cuda): introduce cuda acceleration for the pbs and keyswitch - a new crate concrete-cuda is added to the repository, containing some Cuda implementations for the bootstrap and keyswitch and a Rust wrapping to call them - a new backend_cuda is added to concrete-core, with dedicated entities whose memory is located on the GPU and engines that call the Cuda accelerated functions --- CMakeLists.txt | 88 + CPPLINT.cfg | 3 + check_cuda.cu | 22 + include/bootstrap.h | 94 + include/device.h | 30 + include/helper_cuda.h | 1154 ++++ include/helper_debug.cuh | 100 + include/helper_string.h | 664 ++ include/keyswitch.h | 24 + parameters/CMakeLists.txt | 4 + parameters/parameters.cpp | 380 ++ src/CMakeLists.txt | 10 + src/bootstrap.cu | 1 + src/bootstrap_amortized.cu | 174 + src/bootstrap_amortized.cuh | 466 ++ src/bootstrap_low_latency.cu | 183 + src/bootstrap_low_latency.cuh | 348 + src/complex/operations.cuh | 87 + src/crypto/bootstrapping_key.cuh | 157 + src/crypto/gadget.cuh | 91 + src/crypto/torus.cuh | 45 + src/device.cu | 147 + src/fft/bnsmfft.cuh | 753 +++ src/fft/smfft.cuh | 402 ++ src/fft/twiddles.cu | 8204 ++++++++++++++++++++++++ src/fft/twiddles.cuh | 28 + src/keyswitch.cu | 55 + src/keyswitch.cuh | 146 + src/polynomial/functions.cuh | 261 + src/polynomial/parameters.cuh | 78 + src/polynomial/polynomial.cuh | 668 ++ src/polynomial/polynomial_math.cuh | 65 + src/polynomial/polynomial_twiddles.cuh | 1 + src/types/int128.cuh | 76 + src/utils/kernel_dimensions.cuh | 15 + src/utils/memory.cuh | 90 + src/utils/timer.cuh | 29 + 37 files changed, 15143 insertions(+) create mode 100644 CMakeLists.txt create mode 100644 CPPLINT.cfg create mode 100644 check_cuda.cu create mode 100644 include/bootstrap.h create mode 100644 include/device.h create mode 100644 include/helper_cuda.h create mode 100644 include/helper_debug.cuh create mode 100644 include/helper_string.h create mode 100644 include/keyswitch.h create mode 100644 parameters/CMakeLists.txt create mode 100644 parameters/parameters.cpp create mode 100644 src/CMakeLists.txt create mode 100644 src/bootstrap.cu create mode 100644 src/bootstrap_amortized.cu create mode 100644 src/bootstrap_amortized.cuh create mode 100644 src/bootstrap_low_latency.cu create mode 100644 src/bootstrap_low_latency.cuh create mode 100644 src/complex/operations.cuh create mode 100644 src/crypto/bootstrapping_key.cuh create mode 100644 src/crypto/gadget.cuh create mode 100644 src/crypto/torus.cuh create mode 100644 src/device.cu create mode 100644 src/fft/bnsmfft.cuh create mode 100644 src/fft/smfft.cuh create mode 100644 src/fft/twiddles.cu create mode 100644 src/fft/twiddles.cuh create mode 100644 src/keyswitch.cu create mode 100644 src/keyswitch.cuh create mode 100644 src/polynomial/functions.cuh create mode 100644 src/polynomial/parameters.cuh create mode 100644 src/polynomial/polynomial.cuh create mode 100644 src/polynomial/polynomial_math.cuh create mode 100644 src/polynomial/polynomial_twiddles.cuh create mode 100644 src/types/int128.cuh create mode 100644 src/utils/kernel_dimensions.cuh create mode 100644 src/utils/memory.cuh create mode 100644 src/utils/timer.cuh diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 000000000..eae425e5e --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,88 @@ +cmake_minimum_required(VERSION 3.8 FATAL_ERROR) +project(concrete_cuda LANGUAGES CXX CUDA) + +include(CTest) + +# See if the minimum CUDA version is available. If not, only enable documentation building. +set(MINIMUM_SUPPORTED_CUDA_VERSION 10.0) +include(CheckLanguage) +# See if CUDA is available +check_language(CUDA) +# If so, enable CUDA to check the version. +if (CMAKE_CUDA_COMPILER) + enable_language(CUDA) +endif () +# If CUDA is not available, or the minimum version is too low do not build +if (NOT CMAKE_CUDA_COMPILER) + message(FATAL_ERROR "Cuda compiler not found.") +endif() + +if (CMAKE_CUDA_COMPILER_VERSION VERSION_LESS ${MINIMUM_SUPPORTED_CUDA_VERSION}) + message(FATAL_ERROR "CUDA ${MINIMUM_SUPPORTED_CUDA_VERSION} or greater is required for compilation.") +endif() +#Get CUDA compute capability +set(OUTPUTFILE ${CMAKE_CURRENT_SOURCE_DIR}/cuda_script) # No suffix required +set(CUDAFILE ${CMAKE_CURRENT_SOURCE_DIR}/check_cuda.cu) +execute_process(COMMAND nvcc -lcuda ${CUDAFILE} -o ${OUTPUTFILE}) +execute_process(COMMAND ${OUTPUTFILE} + RESULT_VARIABLE CUDA_RETURN_CODE + OUTPUT_VARIABLE ARCH) + +if (${CUDA_RETURN_CODE} EQUAL 0) + set(CUDA_SUCCESS "TRUE") +else () + set(CUDA_SUCCESS "FALSE") +endif () + +if (${CUDA_SUCCESS}) + message(STATUS "CUDA Architecture: ${ARCH}") + message(STATUS "CUDA Version: ${CUDA_VERSION_STRING}") + message(STATUS "CUDA Path: ${CUDA_TOOLKIT_ROOT_DIR}") + message(STATUS "CUDA Libraries: ${CUDA_LIBRARIES}") + message(STATUS "CUDA Performance Primitives: ${CUDA_npp_LIBRARY}") + + set(CUDA_NVCC_FLAGS "${ARCH}") + #add_definitions(-DGPU) #You may not require this + +else () + message(WARNING ${ARCH}) +endif () + +if (NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE Release) +endif () + +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g") +if (NOT CUDA_NVCC_FLAGS) + set(CUDA_NVCC_FLAGS -arch=sm_70) +endif () + +# in production, should use -arch=sm_70 +# --ptxas-options=-v to see register spills +# -lineinfo for better debugging +set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -ccbin ${CMAKE_CXX_COMPILER} -O3 ${CUDA_NVCC_FLAGS} \ + -std=c++17 --no-exceptions --expt-relaxed-constexpr -rdc=true --use_fast_math -Xcompiler -fPIC") + +set(INCLUDE_DIR include) + +add_subdirectory(src) +add_subdirectory(parameters) +target_include_directories(concrete_cuda PRIVATE ${INCLUDE_DIR}) + +# This is required for rust cargo build +install(TARGETS concrete_cuda DESTINATION .) +install(TARGETS concrete_cuda DESTINATION lib) +install(TARGETS cuda_parameters DESTINATION .) +install(TARGETS cuda_parameters DESTINATION lib) + +# Define a function to add a lint target. +find_file(CPPLINT NAMES cpplint cpplint.exe) +if (CPPLINT) + # Add a custom target to lint all child projects. Dependencies are specified in child projects. + add_custom_target(all_lint) + # Don't trigger this target on ALL_BUILD or Visual Studio 'Rebuild Solution' + set_target_properties(all_lint PROPERTIES EXCLUDE_FROM_ALL TRUE) + # set_target_properties(all_lint PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD TRUE) +endif () diff --git a/CPPLINT.cfg b/CPPLINT.cfg new file mode 100644 index 000000000..c50c2762a --- /dev/null +++ b/CPPLINT.cfg @@ -0,0 +1,3 @@ +set noparent +linelength=240 +filter=-legal/copyright,-readability/todo,-runtime/references,-build/c++17 diff --git a/check_cuda.cu b/check_cuda.cu new file mode 100644 index 000000000..af56ff9a6 --- /dev/null +++ b/check_cuda.cu @@ -0,0 +1,22 @@ +#include + +int main(int argc, char **argv) { + cudaDeviceProp dP; + float min_cc = 3.0; + + int rc = cudaGetDeviceProperties(&dP, 0); + if (rc != cudaSuccess) { + cudaError_t error = cudaGetLastError(); + printf("CUDA error: %s", cudaGetErrorString(error)); + return rc; /* Failure */ + } + if ((dP.major + (dP.minor / 10)) < min_cc) { + printf("Min Compute Capability of %2.1f required: %d.%d found\n Not " + "Building CUDA Code", + min_cc, dP.major, dP.minor); + return 1; /* Failure */ + } else { + printf("-arch=sm_%d%d", dP.major, dP.minor); + return 0; /* Success */ + } +} diff --git a/include/bootstrap.h b/include/bootstrap.h new file mode 100644 index 000000000..c8f765808 --- /dev/null +++ b/include/bootstrap.h @@ -0,0 +1,94 @@ +#ifndef CUDA_BOOTSTRAP_H +#define CUDA_BOOTSTRAP_H + +#include + +extern "C" { + +void cuda_initialize_twiddles(uint32_t polynomial_size, uint32_t gpu_index); + +void cuda_convert_lwe_bootstrap_key_32(void *dest, void *src, void *v_stream, + uint32_t gpu_index, uint32_t input_lwe_dim, uint32_t glwe_dim, + uint32_t l_gadget, uint32_t polynomial_size); + +void cuda_convert_lwe_bootstrap_key_64(void *dest, void *src, void *v_stream, + uint32_t gpu_index, uint32_t input_lwe_dim, uint32_t glwe_dim, + uint32_t l_gadget, uint32_t polynomial_size); + +void cuda_bootstrap_amortized_lwe_ciphertext_vector_32( + void *v_stream, + void *lwe_out, + void *test_vector, + void *test_vector_indexes, + void *lwe_in, + void *bootstrapping_key, + uint32_t input_lwe_dimension, + uint32_t polynomial_size, + uint32_t base_log, + uint32_t l_gadget, + uint32_t num_samples, + uint32_t num_test_vectors, + uint32_t lwe_idx, + uint32_t max_shared_memory); + +void cuda_bootstrap_amortized_lwe_ciphertext_vector_64( + void *v_stream, + void *lwe_out, + void *test_vector, + void *test_vector_indexes, + void *lwe_in, + void *bootstrapping_key, + uint32_t input_lwe_dimension, + uint32_t polynomial_size, + uint32_t base_log, + uint32_t l_gadget, + uint32_t num_samples, + uint32_t num_test_vectors, + uint32_t lwe_idx, + uint32_t max_shared_memory); + +void cuda_bootstrap_low_latency_lwe_ciphertext_vector_32( + void *v_stream, + void *lwe_out, + void *test_vector, + void *test_vector_indexes, + void *lwe_in, + void *bootstrapping_key, + uint32_t input_lwe_dimension, + uint32_t polynomial_size, + uint32_t base_log, + uint32_t l_gadget, + uint32_t num_samples, + uint32_t num_test_vectors, + uint32_t lwe_idx, + uint32_t max_shared_memory); + +void cuda_bootstrap_low_latency_lwe_ciphertext_vector_64( + void *v_stream, + void *lwe_out, + void *test_vector, + void *test_vector_indexes, + void *lwe_in, + void *bootstrapping_key, + uint32_t input_lwe_dimension, + uint32_t polynomial_size, + uint32_t base_log, + uint32_t l_gadget, + uint32_t num_samples, + uint32_t num_test_vectors, + uint32_t lwe_idx, + uint32_t max_shared_memory); +}; + +__device__ inline int get_start_ith_ggsw(int i, uint32_t polynomial_size, + int glwe_dimension, + uint32_t l_gadget); + +__device__ double2* +get_ith_mask_kth_block(double2* ptr, int i, int k, int level, uint32_t polynomial_size, + int glwe_dimension, uint32_t l_gadget); + +__device__ double2* +get_ith_body_kth_block(double2 *ptr, int i, int k, int level, uint32_t polynomial_size, + int glwe_dimension, uint32_t l_gadget); +#endif // CUDA_BOOTSTRAP_H diff --git a/include/device.h b/include/device.h new file mode 100644 index 000000000..4e2d8f2cf --- /dev/null +++ b/include/device.h @@ -0,0 +1,30 @@ +#include + +extern "C" { +void *cuda_create_stream(uint32_t gpu_index); + +int cuda_destroy_stream(void *v_stream, uint32_t gpu_index); + +void *cuda_malloc(uint64_t size, uint32_t gpu_index); + +int cuda_check_valid_malloc(uint64_t size, uint32_t gpu_index); + +int cuda_memcpy_to_cpu(void *dest, const void *src, uint64_t size, + uint32_t gpu_index); + +int cuda_memcpy_async_to_gpu(void *dest, void *src, uint64_t size, + void *v_stream, uint32_t gpu_index); + +int cuda_memcpy_to_gpu(void *dest, void *src, uint64_t size, + uint32_t gpu_index); + +int cuda_memcpy_async_to_cpu(void *dest, const void *src, uint64_t size, + void *v_stream, uint32_t gpu_index); +int cuda_get_number_of_gpus(); + +int cuda_synchronize_device(uint32_t gpu_index); + +int cuda_drop(void *ptr, uint32_t gpu_index); + +int cuda_get_max_shared_memory(uint32_t gpu_index); +} diff --git a/include/helper_cuda.h b/include/helper_cuda.h new file mode 100644 index 000000000..2b38732cf --- /dev/null +++ b/include/helper_cuda.h @@ -0,0 +1,1154 @@ +/** + * Copyright 1993-2013 NVIDIA Corporation. All rights reserved. + * + * Please refer to the NVIDIA end user license agreement (EULA) associated + * with this source code for terms and conditions that govern your use of + * this software. Any use, reproduction, disclosure, or distribution of + * this software and related documentation outside the terms of the EULA + * is strictly prohibited. + * + */ + +//////////////////////////////////////////////////////////////////////////////// +// These are CUDA Helper functions for initialization and error checking + +#ifndef HELPER_CUDA_H +#define HELPER_CUDA_H + +#pragma once + +#include +#include +#include + +#include "helper_string.h" + +#ifndef EXIT_WAIVED +#define EXIT_WAIVED 2 +#endif + +// Note, it is required that your SDK sample to include the proper header files, +// please refer the CUDA examples for examples of the needed CUDA headers, which +// may change depending on which CUDA functions are used. + +// CUDA Runtime error messages +#ifdef __DRIVER_TYPES_H__ +static const char *_cudaGetErrorEnum(cudaError_t error) { + switch (error) { + case cudaSuccess: + return "cudaSuccess"; + + case cudaErrorMissingConfiguration: + return "cudaErrorMissingConfiguration"; + + case cudaErrorMemoryAllocation: + return "cudaErrorMemoryAllocation"; + + case cudaErrorInitializationError: + return "cudaErrorInitializationError"; + + case cudaErrorLaunchFailure: + return "cudaErrorLaunchFailure"; + + case cudaErrorPriorLaunchFailure: + return "cudaErrorPriorLaunchFailure"; + + case cudaErrorLaunchTimeout: + return "cudaErrorLaunchTimeout"; + + case cudaErrorLaunchOutOfResources: + return "cudaErrorLaunchOutOfResources"; + + case cudaErrorInvalidDeviceFunction: + return "cudaErrorInvalidDeviceFunction"; + + case cudaErrorInvalidConfiguration: + return "cudaErrorInvalidConfiguration"; + + case cudaErrorInvalidDevice: + return "cudaErrorInvalidDevice"; + + case cudaErrorInvalidValue: + return "cudaErrorInvalidValue"; + + case cudaErrorInvalidPitchValue: + return "cudaErrorInvalidPitchValue"; + + case cudaErrorInvalidSymbol: + return "cudaErrorInvalidSymbol"; + + case cudaErrorMapBufferObjectFailed: + return "cudaErrorMapBufferObjectFailed"; + + case cudaErrorUnmapBufferObjectFailed: + return "cudaErrorUnmapBufferObjectFailed"; + + case cudaErrorInvalidHostPointer: + return "cudaErrorInvalidHostPointer"; + + case cudaErrorInvalidDevicePointer: + return "cudaErrorInvalidDevicePointer"; + + case cudaErrorInvalidTexture: + return "cudaErrorInvalidTexture"; + + case cudaErrorInvalidTextureBinding: + return "cudaErrorInvalidTextureBinding"; + + case cudaErrorInvalidChannelDescriptor: + return "cudaErrorInvalidChannelDescriptor"; + + case cudaErrorInvalidMemcpyDirection: + return "cudaErrorInvalidMemcpyDirection"; + + case cudaErrorAddressOfConstant: + return "cudaErrorAddressOfConstant"; + + case cudaErrorTextureFetchFailed: + return "cudaErrorTextureFetchFailed"; + + case cudaErrorTextureNotBound: + return "cudaErrorTextureNotBound"; + + case cudaErrorSynchronizationError: + return "cudaErrorSynchronizationError"; + + case cudaErrorInvalidFilterSetting: + return "cudaErrorInvalidFilterSetting"; + + case cudaErrorInvalidNormSetting: + return "cudaErrorInvalidNormSetting"; + + case cudaErrorMixedDeviceExecution: + return "cudaErrorMixedDeviceExecution"; + + case cudaErrorCudartUnloading: + return "cudaErrorCudartUnloading"; + + case cudaErrorUnknown: + return "cudaErrorUnknown"; + + case cudaErrorNotYetImplemented: + return "cudaErrorNotYetImplemented"; + + case cudaErrorMemoryValueTooLarge: + return "cudaErrorMemoryValueTooLarge"; + + case cudaErrorInvalidResourceHandle: + return "cudaErrorInvalidResourceHandle"; + + case cudaErrorNotReady: + return "cudaErrorNotReady"; + + case cudaErrorInsufficientDriver: + return "cudaErrorInsufficientDriver"; + + case cudaErrorSetOnActiveProcess: + return "cudaErrorSetOnActiveProcess"; + + case cudaErrorInvalidSurface: + return "cudaErrorInvalidSurface"; + + case cudaErrorNoDevice: + return "cudaErrorNoDevice"; + + case cudaErrorECCUncorrectable: + return "cudaErrorECCUncorrectable"; + + case cudaErrorSharedObjectSymbolNotFound: + return "cudaErrorSharedObjectSymbolNotFound"; + + case cudaErrorSharedObjectInitFailed: + return "cudaErrorSharedObjectInitFailed"; + + case cudaErrorUnsupportedLimit: + return "cudaErrorUnsupportedLimit"; + + case cudaErrorDuplicateVariableName: + return "cudaErrorDuplicateVariableName"; + + case cudaErrorDuplicateTextureName: + return "cudaErrorDuplicateTextureName"; + + case cudaErrorDuplicateSurfaceName: + return "cudaErrorDuplicateSurfaceName"; + + case cudaErrorDevicesUnavailable: + return "cudaErrorDevicesUnavailable"; + + case cudaErrorInvalidKernelImage: + return "cudaErrorInvalidKernelImage"; + + case cudaErrorNoKernelImageForDevice: + return "cudaErrorNoKernelImageForDevice"; + + case cudaErrorIncompatibleDriverContext: + return "cudaErrorIncompatibleDriverContext"; + + case cudaErrorPeerAccessAlreadyEnabled: + return "cudaErrorPeerAccessAlreadyEnabled"; + + case cudaErrorPeerAccessNotEnabled: + return "cudaErrorPeerAccessNotEnabled"; + + case cudaErrorDeviceAlreadyInUse: + return "cudaErrorDeviceAlreadyInUse"; + + case cudaErrorProfilerDisabled: + return "cudaErrorProfilerDisabled"; + + case cudaErrorProfilerNotInitialized: + return "cudaErrorProfilerNotInitialized"; + + case cudaErrorProfilerAlreadyStarted: + return "cudaErrorProfilerAlreadyStarted"; + + case cudaErrorProfilerAlreadyStopped: + return "cudaErrorProfilerAlreadyStopped"; + + /* Since CUDA 4.0*/ + case cudaErrorAssert: + return "cudaErrorAssert"; + + case cudaErrorTooManyPeers: + return "cudaErrorTooManyPeers"; + + case cudaErrorHostMemoryAlreadyRegistered: + return "cudaErrorHostMemoryAlreadyRegistered"; + + case cudaErrorHostMemoryNotRegistered: + return "cudaErrorHostMemoryNotRegistered"; + + /* Since CUDA 5.0 */ + case cudaErrorOperatingSystem: + return "cudaErrorOperatingSystem"; + + case cudaErrorPeerAccessUnsupported: + return "cudaErrorPeerAccessUnsupported"; + + case cudaErrorLaunchMaxDepthExceeded: + return "cudaErrorLaunchMaxDepthExceeded"; + + case cudaErrorLaunchFileScopedTex: + return "cudaErrorLaunchFileScopedTex"; + + case cudaErrorLaunchFileScopedSurf: + return "cudaErrorLaunchFileScopedSurf"; + + case cudaErrorSyncDepthExceeded: + return "cudaErrorSyncDepthExceeded"; + + case cudaErrorLaunchPendingCountExceeded: + return "cudaErrorLaunchPendingCountExceeded"; + + case cudaErrorNotPermitted: + return "cudaErrorNotPermitted"; + + case cudaErrorNotSupported: + return "cudaErrorNotSupported"; + + /* Since CUDA 6.0 */ + case cudaErrorHardwareStackError: + return "cudaErrorHardwareStackError"; + + case cudaErrorIllegalInstruction: + return "cudaErrorIllegalInstruction"; + + case cudaErrorMisalignedAddress: + return "cudaErrorMisalignedAddress"; + + case cudaErrorInvalidAddressSpace: + return "cudaErrorInvalidAddressSpace"; + + case cudaErrorInvalidPc: + return "cudaErrorInvalidPc"; + + case cudaErrorIllegalAddress: + return "cudaErrorIllegalAddress"; + + /* Since CUDA 6.5*/ + case cudaErrorInvalidPtx: + return "cudaErrorInvalidPtx"; + + case cudaErrorInvalidGraphicsContext: + return "cudaErrorInvalidGraphicsContext"; + + case cudaErrorStartupFailure: + return "cudaErrorStartupFailure"; + + case cudaErrorApiFailureBase: + return "cudaErrorApiFailureBase"; + } + + return ""; +} +#endif + +#ifdef __cuda_cuda_h__ +// CUDA Driver API errors +static const char *_cudaGetErrorEnum(CUresult error) { + switch (error) { + case CUDA_SUCCESS: + return "CUDA_SUCCESS"; + + case CUDA_ERROR_INVALID_VALUE: + return "CUDA_ERROR_INVALID_VALUE"; + + case CUDA_ERROR_OUT_OF_MEMORY: + return "CUDA_ERROR_OUT_OF_MEMORY"; + + case CUDA_ERROR_NOT_INITIALIZED: + return "CUDA_ERROR_NOT_INITIALIZED"; + + case CUDA_ERROR_DEINITIALIZED: + return "CUDA_ERROR_DEINITIALIZED"; + + case CUDA_ERROR_PROFILER_DISABLED: + return "CUDA_ERROR_PROFILER_DISABLED"; + + case CUDA_ERROR_PROFILER_NOT_INITIALIZED: + return "CUDA_ERROR_PROFILER_NOT_INITIALIZED"; + + case CUDA_ERROR_PROFILER_ALREADY_STARTED: + return "CUDA_ERROR_PROFILER_ALREADY_STARTED"; + + case CUDA_ERROR_PROFILER_ALREADY_STOPPED: + return "CUDA_ERROR_PROFILER_ALREADY_STOPPED"; + + case CUDA_ERROR_NO_DEVICE: + return "CUDA_ERROR_NO_DEVICE"; + + case CUDA_ERROR_INVALID_DEVICE: + return "CUDA_ERROR_INVALID_DEVICE"; + + case CUDA_ERROR_INVALID_IMAGE: + return "CUDA_ERROR_INVALID_IMAGE"; + + case CUDA_ERROR_INVALID_CONTEXT: + return "CUDA_ERROR_INVALID_CONTEXT"; + + case CUDA_ERROR_CONTEXT_ALREADY_CURRENT: + return "CUDA_ERROR_CONTEXT_ALREADY_CURRENT"; + + case CUDA_ERROR_MAP_FAILED: + return "CUDA_ERROR_MAP_FAILED"; + + case CUDA_ERROR_UNMAP_FAILED: + return "CUDA_ERROR_UNMAP_FAILED"; + + case CUDA_ERROR_ARRAY_IS_MAPPED: + return "CUDA_ERROR_ARRAY_IS_MAPPED"; + + case CUDA_ERROR_ALREADY_MAPPED: + return "CUDA_ERROR_ALREADY_MAPPED"; + + case CUDA_ERROR_NO_BINARY_FOR_GPU: + return "CUDA_ERROR_NO_BINARY_FOR_GPU"; + + case CUDA_ERROR_ALREADY_ACQUIRED: + return "CUDA_ERROR_ALREADY_ACQUIRED"; + + case CUDA_ERROR_NOT_MAPPED: + return "CUDA_ERROR_NOT_MAPPED"; + + case CUDA_ERROR_NOT_MAPPED_AS_ARRAY: + return "CUDA_ERROR_NOT_MAPPED_AS_ARRAY"; + + case CUDA_ERROR_NOT_MAPPED_AS_POINTER: + return "CUDA_ERROR_NOT_MAPPED_AS_POINTER"; + + case CUDA_ERROR_ECC_UNCORRECTABLE: + return "CUDA_ERROR_ECC_UNCORRECTABLE"; + + case CUDA_ERROR_UNSUPPORTED_LIMIT: + return "CUDA_ERROR_UNSUPPORTED_LIMIT"; + + case CUDA_ERROR_CONTEXT_ALREADY_IN_USE: + return "CUDA_ERROR_CONTEXT_ALREADY_IN_USE"; + + case CUDA_ERROR_INVALID_SOURCE: + return "CUDA_ERROR_INVALID_SOURCE"; + + case CUDA_ERROR_FILE_NOT_FOUND: + return "CUDA_ERROR_FILE_NOT_FOUND"; + + case CUDA_ERROR_SHARED_OBJECT_SYMBOL_NOT_FOUND: + return "CUDA_ERROR_SHARED_OBJECT_SYMBOL_NOT_FOUND"; + + case CUDA_ERROR_SHARED_OBJECT_INIT_FAILED: + return "CUDA_ERROR_SHARED_OBJECT_INIT_FAILED"; + + case CUDA_ERROR_OPERATING_SYSTEM: + return "CUDA_ERROR_OPERATING_SYSTEM"; + + case CUDA_ERROR_INVALID_HANDLE: + return "CUDA_ERROR_INVALID_HANDLE"; + + case CUDA_ERROR_NOT_FOUND: + return "CUDA_ERROR_NOT_FOUND"; + + case CUDA_ERROR_NOT_READY: + return "CUDA_ERROR_NOT_READY"; + + case CUDA_ERROR_LAUNCH_FAILED: + return "CUDA_ERROR_LAUNCH_FAILED"; + + case CUDA_ERROR_LAUNCH_OUT_OF_RESOURCES: + return "CUDA_ERROR_LAUNCH_OUT_OF_RESOURCES"; + + case CUDA_ERROR_LAUNCH_TIMEOUT: + return "CUDA_ERROR_LAUNCH_TIMEOUT"; + + case CUDA_ERROR_LAUNCH_INCOMPATIBLE_TEXTURING: + return "CUDA_ERROR_LAUNCH_INCOMPATIBLE_TEXTURING"; + + case CUDA_ERROR_PEER_ACCESS_ALREADY_ENABLED: + return "CUDA_ERROR_PEER_ACCESS_ALREADY_ENABLED"; + + case CUDA_ERROR_PEER_ACCESS_NOT_ENABLED: + return "CUDA_ERROR_PEER_ACCESS_NOT_ENABLED"; + + case CUDA_ERROR_PRIMARY_CONTEXT_ACTIVE: + return "CUDA_ERROR_PRIMARY_CONTEXT_ACTIVE"; + + case CUDA_ERROR_CONTEXT_IS_DESTROYED: + return "CUDA_ERROR_CONTEXT_IS_DESTROYED"; + + case CUDA_ERROR_ASSERT: + return "CUDA_ERROR_ASSERT"; + + case CUDA_ERROR_TOO_MANY_PEERS: + return "CUDA_ERROR_TOO_MANY_PEERS"; + + case CUDA_ERROR_HOST_MEMORY_ALREADY_REGISTERED: + return "CUDA_ERROR_HOST_MEMORY_ALREADY_REGISTERED"; + + case CUDA_ERROR_HOST_MEMORY_NOT_REGISTERED: + return "CUDA_ERROR_HOST_MEMORY_NOT_REGISTERED"; + + case CUDA_ERROR_UNKNOWN: + return "CUDA_ERROR_UNKNOWN"; + } + + return ""; +} +#endif + +#ifdef CUBLAS_API_H_ +// cuBLAS API errors +static const char *_cudaGetErrorEnum(cublasStatus_t error) { + switch (error) { + case CUBLAS_STATUS_SUCCESS: + return "CUBLAS_STATUS_SUCCESS"; + + case CUBLAS_STATUS_NOT_INITIALIZED: + return "CUBLAS_STATUS_NOT_INITIALIZED"; + + case CUBLAS_STATUS_ALLOC_FAILED: + return "CUBLAS_STATUS_ALLOC_FAILED"; + + case CUBLAS_STATUS_INVALID_VALUE: + return "CUBLAS_STATUS_INVALID_VALUE"; + + case CUBLAS_STATUS_ARCH_MISMATCH: + return "CUBLAS_STATUS_ARCH_MISMATCH"; + + case CUBLAS_STATUS_MAPPING_ERROR: + return "CUBLAS_STATUS_MAPPING_ERROR"; + + case CUBLAS_STATUS_EXECUTION_FAILED: + return "CUBLAS_STATUS_EXECUTION_FAILED"; + + case CUBLAS_STATUS_INTERNAL_ERROR: + return "CUBLAS_STATUS_INTERNAL_ERROR"; + } + + return ""; +} +#endif + +#ifdef _CUFFT_H_ +// cuFFT API errors +static const char *_cudaGetErrorEnum(cufftResult error) { + switch (error) { + case CUFFT_SUCCESS: + return "CUFFT_SUCCESS"; + + case CUFFT_INVALID_PLAN: + return "CUFFT_INVALID_PLAN"; + + case CUFFT_ALLOC_FAILED: + return "CUFFT_ALLOC_FAILED"; + + case CUFFT_INVALID_TYPE: + return "CUFFT_INVALID_TYPE"; + + case CUFFT_INVALID_VALUE: + return "CUFFT_INVALID_VALUE"; + + case CUFFT_INTERNAL_ERROR: + return "CUFFT_INTERNAL_ERROR"; + + case CUFFT_EXEC_FAILED: + return "CUFFT_EXEC_FAILED"; + + case CUFFT_SETUP_FAILED: + return "CUFFT_SETUP_FAILED"; + + case CUFFT_INVALID_SIZE: + return "CUFFT_INVALID_SIZE"; + + case CUFFT_UNALIGNED_DATA: + return "CUFFT_UNALIGNED_DATA"; + + case CUFFT_INCOMPLETE_PARAMETER_LIST: + return "CUFFT_INCOMPLETE_PARAMETER_LIST"; + + case CUFFT_INVALID_DEVICE: + return "CUFFT_INVALID_DEVICE"; + + case CUFFT_PARSE_ERROR: + return "CUFFT_PARSE_ERROR"; + + case CUFFT_NO_WORKSPACE: + return "CUFFT_NO_WORKSPACE"; + + case CUFFT_NOT_IMPLEMENTED: + return "CUFFT_NOT_IMPLEMENTED"; + + case CUFFT_LICENSE_ERROR: + return "CUFFT_LICENSE_ERROR"; + } + + return ""; +} +#endif + +#ifdef CUSPARSEAPI +// cuSPARSE API errors +static const char *_cudaGetErrorEnum(cusparseStatus_t error) { + switch (error) { + case CUSPARSE_STATUS_SUCCESS: + return "CUSPARSE_STATUS_SUCCESS"; + + case CUSPARSE_STATUS_NOT_INITIALIZED: + return "CUSPARSE_STATUS_NOT_INITIALIZED"; + + case CUSPARSE_STATUS_ALLOC_FAILED: + return "CUSPARSE_STATUS_ALLOC_FAILED"; + + case CUSPARSE_STATUS_INVALID_VALUE: + return "CUSPARSE_STATUS_INVALID_VALUE"; + + case CUSPARSE_STATUS_ARCH_MISMATCH: + return "CUSPARSE_STATUS_ARCH_MISMATCH"; + + case CUSPARSE_STATUS_MAPPING_ERROR: + return "CUSPARSE_STATUS_MAPPING_ERROR"; + + case CUSPARSE_STATUS_EXECUTION_FAILED: + return "CUSPARSE_STATUS_EXECUTION_FAILED"; + + case CUSPARSE_STATUS_INTERNAL_ERROR: + return "CUSPARSE_STATUS_INTERNAL_ERROR"; + + case CUSPARSE_STATUS_MATRIX_TYPE_NOT_SUPPORTED: + return "CUSPARSE_STATUS_MATRIX_TYPE_NOT_SUPPORTED"; + } + + return ""; +} +#endif + +#ifdef CURAND_H_ +// cuRAND API errors +static const char *_cudaGetErrorEnum(curandStatus_t error) { + switch (error) { + case CURAND_STATUS_SUCCESS: + return "CURAND_STATUS_SUCCESS"; + + case CURAND_STATUS_VERSION_MISMATCH: + return "CURAND_STATUS_VERSION_MISMATCH"; + + case CURAND_STATUS_NOT_INITIALIZED: + return "CURAND_STATUS_NOT_INITIALIZED"; + + case CURAND_STATUS_ALLOCATION_FAILED: + return "CURAND_STATUS_ALLOCATION_FAILED"; + + case CURAND_STATUS_TYPE_ERROR: + return "CURAND_STATUS_TYPE_ERROR"; + + case CURAND_STATUS_OUT_OF_RANGE: + return "CURAND_STATUS_OUT_OF_RANGE"; + + case CURAND_STATUS_LENGTH_NOT_MULTIPLE: + return "CURAND_STATUS_LENGTH_NOT_MULTIPLE"; + + case CURAND_STATUS_DOUBLE_PRECISION_REQUIRED: + return "CURAND_STATUS_DOUBLE_PRECISION_REQUIRED"; + + case CURAND_STATUS_LAUNCH_FAILURE: + return "CURAND_STATUS_LAUNCH_FAILURE"; + + case CURAND_STATUS_PREEXISTING_FAILURE: + return "CURAND_STATUS_PREEXISTING_FAILURE"; + + case CURAND_STATUS_INITIALIZATION_FAILED: + return "CURAND_STATUS_INITIALIZATION_FAILED"; + + case CURAND_STATUS_ARCH_MISMATCH: + return "CURAND_STATUS_ARCH_MISMATCH"; + + case CURAND_STATUS_INTERNAL_ERROR: + return "CURAND_STATUS_INTERNAL_ERROR"; + } + + return ""; +} +#endif + +#ifdef NV_NPPIDEFS_H +// NPP API errors +static const char *_cudaGetErrorEnum(NppStatus error) { + switch (error) { + case NPP_NOT_SUPPORTED_MODE_ERROR: + return "NPP_NOT_SUPPORTED_MODE_ERROR"; + + case NPP_ROUND_MODE_NOT_SUPPORTED_ERROR: + return "NPP_ROUND_MODE_NOT_SUPPORTED_ERROR"; + + case NPP_RESIZE_NO_OPERATION_ERROR: + return "NPP_RESIZE_NO_OPERATION_ERROR"; + + case NPP_NOT_SUFFICIENT_COMPUTE_CAPABILITY: + return "NPP_NOT_SUFFICIENT_COMPUTE_CAPABILITY"; + +#if ((NPP_VERSION_MAJOR << 12) + (NPP_VERSION_MINOR << 4)) <= 0x5000 + + case NPP_BAD_ARG_ERROR: + return "NPP_BAD_ARGUMENT_ERROR"; + + case NPP_COEFF_ERROR: + return "NPP_COEFFICIENT_ERROR"; + + case NPP_RECT_ERROR: + return "NPP_RECTANGLE_ERROR"; + + case NPP_QUAD_ERROR: + return "NPP_QUADRANGLE_ERROR"; + + case NPP_MEM_ALLOC_ERR: + return "NPP_MEMORY_ALLOCATION_ERROR"; + + case NPP_HISTO_NUMBER_OF_LEVELS_ERROR: + return "NPP_HISTOGRAM_NUMBER_OF_LEVELS_ERROR"; + + case NPP_INVALID_INPUT: + return "NPP_INVALID_INPUT"; + + case NPP_POINTER_ERROR: + return "NPP_POINTER_ERROR"; + + case NPP_WARNING: + return "NPP_WARNING"; + + case NPP_ODD_ROI_WARNING: + return "NPP_ODD_ROI_WARNING"; +#else + + // These are for CUDA 5.5 or higher + case NPP_BAD_ARGUMENT_ERROR: + return "NPP_BAD_ARGUMENT_ERROR"; + + case NPP_COEFFICIENT_ERROR: + return "NPP_COEFFICIENT_ERROR"; + + case NPP_RECTANGLE_ERROR: + return "NPP_RECTANGLE_ERROR"; + + case NPP_QUADRANGLE_ERROR: + return "NPP_QUADRANGLE_ERROR"; + + case NPP_MEMORY_ALLOCATION_ERR: + return "NPP_MEMORY_ALLOCATION_ERROR"; + + case NPP_HISTOGRAM_NUMBER_OF_LEVELS_ERROR: + return "NPP_HISTOGRAM_NUMBER_OF_LEVELS_ERROR"; + + case NPP_INVALID_HOST_POINTER_ERROR: + return "NPP_INVALID_HOST_POINTER_ERROR"; + + case NPP_INVALID_DEVICE_POINTER_ERROR: + return "NPP_INVALID_DEVICE_POINTER_ERROR"; +#endif + + case NPP_LUT_NUMBER_OF_LEVELS_ERROR: + return "NPP_LUT_NUMBER_OF_LEVELS_ERROR"; + + case NPP_TEXTURE_BIND_ERROR: + return "NPP_TEXTURE_BIND_ERROR"; + + case NPP_WRONG_INTERSECTION_ROI_ERROR: + return "NPP_WRONG_INTERSECTION_ROI_ERROR"; + + case NPP_NOT_EVEN_STEP_ERROR: + return "NPP_NOT_EVEN_STEP_ERROR"; + + case NPP_INTERPOLATION_ERROR: + return "NPP_INTERPOLATION_ERROR"; + + case NPP_RESIZE_FACTOR_ERROR: + return "NPP_RESIZE_FACTOR_ERROR"; + + case NPP_HAAR_CLASSIFIER_PIXEL_MATCH_ERROR: + return "NPP_HAAR_CLASSIFIER_PIXEL_MATCH_ERROR"; + +#if ((NPP_VERSION_MAJOR << 12) + (NPP_VERSION_MINOR << 4)) <= 0x5000 + + case NPP_MEMFREE_ERR: + return "NPP_MEMFREE_ERR"; + + case NPP_MEMSET_ERR: + return "NPP_MEMSET_ERR"; + + case NPP_MEMCPY_ERR: + return "NPP_MEMCPY_ERROR"; + + case NPP_MIRROR_FLIP_ERR: + return "NPP_MIRROR_FLIP_ERR"; +#else + + case NPP_MEMFREE_ERROR: + return "NPP_MEMFREE_ERROR"; + + case NPP_MEMSET_ERROR: + return "NPP_MEMSET_ERROR"; + + case NPP_MEMCPY_ERROR: + return "NPP_MEMCPY_ERROR"; + + case NPP_MIRROR_FLIP_ERROR: + return "NPP_MIRROR_FLIP_ERROR"; +#endif + + case NPP_ALIGNMENT_ERROR: + return "NPP_ALIGNMENT_ERROR"; + + case NPP_STEP_ERROR: + return "NPP_STEP_ERROR"; + + case NPP_SIZE_ERROR: + return "NPP_SIZE_ERROR"; + + case NPP_NULL_POINTER_ERROR: + return "NPP_NULL_POINTER_ERROR"; + + case NPP_CUDA_KERNEL_EXECUTION_ERROR: + return "NPP_CUDA_KERNEL_EXECUTION_ERROR"; + + case NPP_NOT_IMPLEMENTED_ERROR: + return "NPP_NOT_IMPLEMENTED_ERROR"; + + case NPP_ERROR: + return "NPP_ERROR"; + + case NPP_SUCCESS: + return "NPP_SUCCESS"; + + case NPP_WRONG_INTERSECTION_QUAD_WARNING: + return "NPP_WRONG_INTERSECTION_QUAD_WARNING"; + + case NPP_MISALIGNED_DST_ROI_WARNING: + return "NPP_MISALIGNED_DST_ROI_WARNING"; + + case NPP_AFFINE_QUAD_INCORRECT_WARNING: + return "NPP_AFFINE_QUAD_INCORRECT_WARNING"; + + case NPP_DOUBLE_SIZE_WARNING: + return "NPP_DOUBLE_SIZE_WARNING"; + + case NPP_WRONG_INTERSECTION_ROI_WARNING: + return "NPP_WRONG_INTERSECTION_ROI_WARNING"; + +#if ((NPP_VERSION_MAJOR << 12) + (NPP_VERSION_MINOR << 4)) >= 0x6000 + /* These are 6.0 or higher */ + case NPP_LUT_PALETTE_BITSIZE_ERROR: + return "NPP_LUT_PALETTE_BITSIZE_ERROR"; + + case NPP_ZC_MODE_NOT_SUPPORTED_ERROR: + return "NPP_ZC_MODE_NOT_SUPPORTED_ERROR"; + + case NPP_QUALITY_INDEX_ERROR: + return "NPP_QUALITY_INDEX_ERROR"; + + case NPP_CHANNEL_ORDER_ERROR: + return "NPP_CHANNEL_ORDER_ERROR"; + + case NPP_ZERO_MASK_VALUE_ERROR: + return "NPP_ZERO_MASK_VALUE_ERROR"; + + case NPP_NUMBER_OF_CHANNELS_ERROR: + return "NPP_NUMBER_OF_CHANNELS_ERROR"; + + case NPP_COI_ERROR: + return "NPP_COI_ERROR"; + + case NPP_DIVISOR_ERROR: + return "NPP_DIVISOR_ERROR"; + + case NPP_CHANNEL_ERROR: + return "NPP_CHANNEL_ERROR"; + + case NPP_STRIDE_ERROR: + return "NPP_STRIDE_ERROR"; + + case NPP_ANCHOR_ERROR: + return "NPP_ANCHOR_ERROR"; + + case NPP_MASK_SIZE_ERROR: + return "NPP_MASK_SIZE_ERROR"; + + case NPP_MOMENT_00_ZERO_ERROR: + return "NPP_MOMENT_00_ZERO_ERROR"; + + case NPP_THRESHOLD_NEGATIVE_LEVEL_ERROR: + return "NPP_THRESHOLD_NEGATIVE_LEVEL_ERROR"; + + case NPP_THRESHOLD_ERROR: + return "NPP_THRESHOLD_ERROR"; + + case NPP_CONTEXT_MATCH_ERROR: + return "NPP_CONTEXT_MATCH_ERROR"; + + case NPP_FFT_FLAG_ERROR: + return "NPP_FFT_FLAG_ERROR"; + + case NPP_FFT_ORDER_ERROR: + return "NPP_FFT_ORDER_ERROR"; + + case NPP_SCALE_RANGE_ERROR: + return "NPP_SCALE_RANGE_ERROR"; + + case NPP_DATA_TYPE_ERROR: + return "NPP_DATA_TYPE_ERROR"; + + case NPP_OUT_OFF_RANGE_ERROR: + return "NPP_OUT_OFF_RANGE_ERROR"; + + case NPP_DIVIDE_BY_ZERO_ERROR: + return "NPP_DIVIDE_BY_ZERO_ERROR"; + + case NPP_RANGE_ERROR: + return "NPP_RANGE_ERROR"; + + case NPP_NO_MEMORY_ERROR: + return "NPP_NO_MEMORY_ERROR"; + + case NPP_ERROR_RESERVED: + return "NPP_ERROR_RESERVED"; + + case NPP_NO_OPERATION_WARNING: + return "NPP_NO_OPERATION_WARNING"; + + case NPP_DIVIDE_BY_ZERO_WARNING: + return "NPP_DIVIDE_BY_ZERO_WARNING"; +#endif + } + + return ""; +} +#endif + +#ifdef __DRIVER_TYPES_H__ +#ifndef DEVICE_RESET +#define DEVICE_RESET cudaDeviceReset(); +#endif +#else +#ifndef DEVICE_RESET +#define DEVICE_RESET +#endif +#endif + +template +void check(T result, char const *const func, const char *const file, + int const line) { + if (result) { + fprintf(stderr, "CUDA error at %s:%d code=%d(%s) \"%s\" \n", file, line, + static_cast(result), _cudaGetErrorEnum(result), func); + DEVICE_RESET + // Make sure we call CUDA Device Reset before exiting + exit(EXIT_FAILURE); + } +} + +#ifdef __DRIVER_TYPES_H__ +// This will output the proper CUDA error strings in the event that a CUDA host +// call returns an error +#define checkCudaErrors(val) check((val), #val, __FILE__, __LINE__) + +// This will output the proper error string when calling cudaGetLastError +#define getLastCudaError(msg) __getLastCudaError(msg, __FILE__, __LINE__) + +inline void __getLastCudaError(const char *errorMessage, const char *file, + const int line) { + cudaError_t err = cudaGetLastError(); + + if (cudaSuccess != err) { + fprintf(stderr, "%s(%i) : getLastCudaError() CUDA error : %s : (%d) %s.\n", + file, line, errorMessage, (int)err, cudaGetErrorString(err)); + DEVICE_RESET + exit(EXIT_FAILURE); + } +} +#endif + +#ifndef MAX +#define MAX(a, b) (a > b ? a : b) +#endif + +// Float To Int conversion +inline int ftoi(float value) { + return (value >= 0 ? (int)(value + 0.5) : (int)(value - 0.5)); +} + +// Beginning of GPU Architecture definitions +inline int _ConvertSMVer2Cores(int major, int minor) { + // Defines for GPU Architecture types (using the SM version to determine the # + // of cores per SM + typedef struct { + int SM; // 0xMm (hexidecimal notation), M = SM Major version, and m = SM + // minor version + int Cores; + } sSMtoCores; + + sSMtoCores nGpuArchCoresPerSM[] = { + {0x20, 32}, // Fermi Generation (SM 2.0) GF100 class + {0x21, 48}, // Fermi Generation (SM 2.1) GF10x class + {0x30, 192}, // Kepler Generation (SM 3.0) GK10x class + {0x32, 192}, // Kepler Generation (SM 3.2) GK10x class + {0x35, 192}, // Kepler Generation (SM 3.5) GK11x class + {0x37, 192}, // Kepler Generation (SM 3.7) GK21x class + {0x50, 128}, // Maxwell Generation (SM 5.0) GM10x class + {0x52, 128}, // Maxwell Generation (SM 5.2) GM20x class + {-1, -1}}; + + int index = 0; + + while (nGpuArchCoresPerSM[index].SM != -1) { + if (nGpuArchCoresPerSM[index].SM == ((major << 4) + minor)) { + return nGpuArchCoresPerSM[index].Cores; + } + + index++; + } + + // If we don't find the values, we default use the previous one to run + // properly + printf( + "MapSMtoCores for SM %d.%d is undefined. Default to use %d Cores/SM\n", + major, minor, nGpuArchCoresPerSM[index - 1].Cores); + return nGpuArchCoresPerSM[index - 1].Cores; +} +// end of GPU Architecture definitions + +#ifdef __CUDA_RUNTIME_H__ +// General GPU Device CUDA Initialization +inline int gpuDeviceInit(int devID) { + int device_count; + checkCudaErrors(cudaGetDeviceCount(&device_count)); + + if (device_count == 0) { + fprintf(stderr, + "gpuDeviceInit() CUDA error: no devices supporting CUDA.\n"); + exit(EXIT_FAILURE); + } + + if (devID < 0) { + devID = 0; + } + + if (devID > device_count - 1) { + fprintf(stderr, "\n"); + fprintf(stderr, ">> %d CUDA capable GPU device(s) detected. <<\n", + device_count); + fprintf(stderr, + ">> gpuDeviceInit (-device=%d) is not a valid GPU device. <<\n", + devID); + fprintf(stderr, "\n"); + return -devID; + } + + cudaDeviceProp deviceProp; + checkCudaErrors(cudaGetDeviceProperties(&deviceProp, devID)); + + if (deviceProp.computeMode == cudaComputeModeProhibited) { + fprintf(stderr, "Error: device is running in , no " + "threads can use ::cudaSetDevice().\n"); + return -1; + } + + if (deviceProp.major < 1) { + fprintf(stderr, "gpuDeviceInit(): GPU device does not support CUDA.\n"); + exit(EXIT_FAILURE); + } + + checkCudaErrors(cudaSetDevice(devID)); + printf("gpuDeviceInit() CUDA Device [%d]: \"%s\n", devID, deviceProp.name); + + return devID; +} + +// This function returns the best GPU (with maximum GFLOPS) +inline int gpuGetMaxGflopsDeviceId() { + int current_device = 0, sm_per_multiproc = 0; + int max_perf_device = 0; + int device_count = 0, best_SM_arch = 0; + int devices_prohibited = 0; + + unsigned long long max_compute_perf = 0; + cudaDeviceProp deviceProp; + cudaGetDeviceCount(&device_count); + + checkCudaErrors(cudaGetDeviceCount(&device_count)); + + if (device_count == 0) { + fprintf( + stderr, + "gpuGetMaxGflopsDeviceId() CUDA error: no devices supporting CUDA.\n"); + exit(EXIT_FAILURE); + } + + // Find the best major SM Architecture GPU device + while (current_device < device_count) { + cudaGetDeviceProperties(&deviceProp, current_device); + + // If this GPU is not running on Compute Mode prohibited, then we can add it + // to the list + if (deviceProp.computeMode != cudaComputeModeProhibited) { + if (deviceProp.major > 0 && deviceProp.major < 9999) { + best_SM_arch = MAX(best_SM_arch, deviceProp.major); + } + } else { + devices_prohibited++; + } + + current_device++; + } + + if (devices_prohibited == device_count) { + fprintf(stderr, "gpuGetMaxGflopsDeviceId() CUDA error: all devices have " + "compute mode prohibited.\n"); + exit(EXIT_FAILURE); + } + + // Find the best CUDA capable GPU device + current_device = 0; + + while (current_device < device_count) { + cudaGetDeviceProperties(&deviceProp, current_device); + + // If this GPU is not running on Compute Mode prohibited, then we can add it + // to the list + if (deviceProp.computeMode != cudaComputeModeProhibited) { + if (deviceProp.major == 9999 && deviceProp.minor == 9999) { + sm_per_multiproc = 1; + } else { + sm_per_multiproc = + _ConvertSMVer2Cores(deviceProp.major, deviceProp.minor); + } + + unsigned long long compute_perf = + (unsigned long long)deviceProp.multiProcessorCount * + sm_per_multiproc * deviceProp.clockRate; + + if (compute_perf > max_compute_perf) { + // If we find GPU with SM major > 2, search only these + if (best_SM_arch > 2) { + // If our device==dest_SM_arch, choose this, or else pass + if (deviceProp.major == best_SM_arch) { + max_compute_perf = compute_perf; + max_perf_device = current_device; + } + } else { + max_compute_perf = compute_perf; + max_perf_device = current_device; + } + } + } + + ++current_device; + } + + return max_perf_device; +} + +// Initialization code to find the best CUDA Device +inline int findCudaDevice(int argc, const char **argv) { + return 0; + /* + cudaDeviceProp deviceProp; + int devID = 0; + + // If the command-line has a device number specified, use it + if (checkCmdLineFlag(argc, argv, "device")) + { + devID = getCmdLineArgumentInt(argc, argv, "device="); + + if (devID < 0) + { + printf("Invalid command line parameter\n "); + exit(EXIT_FAILURE); + } + else + { + devID = gpuDeviceInit(devID); + + if (devID < 0) + { + printf("exiting...\n"); + exit(EXIT_FAILURE); + } + } + } + else + { + // Otherwise pick the device with highest Gflops/s + devID = gpuGetMaxGflopsDeviceId(); + checkCudaErrors(cudaSetDevice(devID)); + checkCudaErrors(cudaGetDeviceProperties(&deviceProp, devID)); + printf("GPU Device %d: \"%s\" with compute capability %d.%d\n\n", + devID, deviceProp.name, deviceProp.major, deviceProp.minor); + } + + return devID; */ +} + +// General check for CUDA GPU SM Capabilities +inline bool checkCudaCapabilities(int major_version, int minor_version) { + cudaDeviceProp deviceProp; + deviceProp.major = 0; + deviceProp.minor = 0; + int dev; + + checkCudaErrors(cudaGetDevice(&dev)); + checkCudaErrors(cudaGetDeviceProperties(&deviceProp, dev)); + + if ((deviceProp.major > major_version) || + (deviceProp.major == major_version && + deviceProp.minor >= minor_version)) { + printf(" Device %d: <%16s >, Compute SM %d.%d detected\n", dev, + deviceProp.name, deviceProp.major, deviceProp.minor); + return true; + } else { + printf(" No GPU device was found that can support CUDA compute capability " + "%d.%d.\n", + major_version, minor_version); + return false; + } +} +#endif + +// end of CUDA Helper Functions + +#endif diff --git a/include/helper_debug.cuh b/include/helper_debug.cuh new file mode 100644 index 000000000..37555339b --- /dev/null +++ b/include/helper_debug.cuh @@ -0,0 +1,100 @@ +#include "cuComplex.h" +#include "thrust/complex.h" +#include +#include +#include + +#define PRINT_VARS +#ifdef PRINT_VARS +#define PRINT_DEBUG_5(var, begin, end, step, cond) \ + _print_debug(var, #var, begin, end, step, cond, "", false) +#define PRINT_DEBUG_6(var, begin, end, step, cond, text) \ + _print_debug(var, #var, begin, end, step, cond, text, true) +#define CAT(A, B) A##B +#define PRINT_SELECT(NAME, NUM) CAT(NAME##_, NUM) +#define GET_COUNT(_1, _2, _3, _4, _5, _6, COUNT, ...) COUNT +#define VA_SIZE(...) GET_COUNT(__VA_ARGS__, 6, 5, 4, 3, 2, 1) +#define PRINT_DEBUG(...) \ + PRINT_SELECT(PRINT_DEBUG, VA_SIZE(__VA_ARGS__))(__VA_ARGS__) +#else +#define PRINT_DEBUG(...) +#endif + +template +__device__ typename std::enable_if::value, void>::type +_print_debug(T *var, const char *var_name, int start, int end, int step, + bool cond, const char *text, bool has_text) { + __syncthreads(); + if (cond) { + if (has_text) + printf("%s\n", text); + for (int i = start; i < end; i += step) { + printf("%s[%u]: %u\n", var_name, i, var[i]); + } + } + __syncthreads(); +} + +template +__device__ typename std::enable_if::value, void>::type +_print_debug(T *var, const char *var_name, int start, int end, int step, + bool cond, const char *text, bool has_text) { + __syncthreads(); + if (cond) { + if (has_text) + printf("%s\n", text); + for (int i = start; i < end; i += step) { + printf("%s[%u]: %d\n", var_name, i, var[i]); + } + } + __syncthreads(); +} + +template +__device__ typename std::enable_if::value, void>::type +_print_debug(T *var, const char *var_name, int start, int end, int step, + bool cond, const char *text, bool has_text) { + __syncthreads(); + if (cond) { + if (has_text) + printf("%s\n", text); + for (int i = start; i < end; i += step) { + printf("%s[%u]: %.15f\n", var_name, i, var[i]); + } + } + __syncthreads(); +} + +template +__device__ + typename std::enable_if>::value, + void>::type + _print_debug(T *var, const char *var_name, int start, int end, int step, + bool cond, const char *text, bool has_text) { + __syncthreads(); + if (cond) { + if (has_text) + printf("%s\n", text); + for (int i = start; i < end; i += step) { + printf("%s[%u]: %.15f , %.15f\n", var_name, i, var[i].real(), + var[i].imag()); + } + } + __syncthreads(); +} + +template +__device__ + typename std::enable_if::value, void>::type + _print_debug(T *var, const char *var_name, int start, int end, int step, + bool cond, const char *text, bool has_text) { + __syncthreads(); + if (cond) { + if (has_text) + printf("%s\n", text); + for (int i = start; i < end; i += step) { + printf("%s[%u]: %.15f , %.15f\n", var_name, i, var[i].x, var[i].y); + } + } + __syncthreads(); +} diff --git a/include/helper_string.h b/include/helper_string.h new file mode 100644 index 000000000..562e06755 --- /dev/null +++ b/include/helper_string.h @@ -0,0 +1,664 @@ +/** + * Copyright 1993-2013 NVIDIA Corporation. All rights reserved. + * + * Please refer to the NVIDIA end user license agreement (EULA) associated + * with this source code for terms and conditions that govern your use of + * this software. Any use, reproduction, disclosure, or distribution of + * this software and related documentation outside the terms of the EULA + * is strictly prohibited. + * + */ + +// These are helper functions for the SDK samples (string parsing, timers, etc) +#ifndef STRING_HELPER_H +#define STRING_HELPER_H + +#include +#include +#include +#include + +#if defined(WIN32) || defined(_WIN32) || defined(WIN64) || defined(_WIN64) +#ifndef _CRT_SECURE_NO_DEPRECATE +#define _CRT_SECURE_NO_DEPRECATE +#endif +#ifndef STRCASECMP +#define STRCASECMP _stricmp +#endif +#ifndef STRNCASECMP +#define STRNCASECMP _strnicmp +#endif +#ifndef STRCPY +#define STRCPY(sFilePath, nLength, sPath) strcpy_s(sFilePath, nLength, sPath) +#endif + +#ifndef FOPEN +#define FOPEN(fHandle, filename, mode) fopen_s(&fHandle, filename, mode) +#endif +#ifndef FOPEN_FAIL +#define FOPEN_FAIL(result) (result != 0) +#endif +#ifndef SSCANF +#define SSCANF sscanf_s +#endif +#ifndef SPRINTF +#define SPRINTF sprintf_s +#endif +#else // Linux Includes +#include +#include + +#ifndef STRCASECMP +#define STRCASECMP strcasecmp +#endif +#ifndef STRNCASECMP +#define STRNCASECMP strncasecmp +#endif +#ifndef STRCPY +#define STRCPY(sFilePath, nLength, sPath) strcpy(sFilePath, sPath) +#endif + +#ifndef FOPEN +#define FOPEN(fHandle, filename, mode) (fHandle = fopen(filename, mode)) +#endif +#ifndef FOPEN_FAIL +#define FOPEN_FAIL(result) (result == NULL) +#endif +#ifndef SSCANF +#define SSCANF sscanf +#endif +#ifndef SPRINTF +#define SPRINTF sprintf +#endif +#endif + +#ifndef EXIT_WAIVED +#define EXIT_WAIVED 2 +#endif + +// CUDA Utility Helper Functions +inline int stringRemoveDelimiter(char delimiter, const char *string) { + int string_start = 0; + + while (string[string_start] == delimiter) { + string_start++; + } + + if (string_start >= (int)strlen(string) - 1) { + return 0; + } + + return string_start; +} + +inline int getFileExtension(char *filename, char **extension) { + int string_length = (int)strlen(filename); + + while (filename[string_length--] != '.') { + if (string_length == 0) + break; + } + + if (string_length > 0) + string_length += 2; + + if (string_length == 0) + *extension = NULL; + else + *extension = &filename[string_length]; + + return string_length; +} + +inline bool checkCmdLineFlag(const int argc, const char **argv, + const char *string_ref) { + bool bFound = false; + + if (argc >= 1) { + for (int i = 1; i < argc; i++) { + int string_start = stringRemoveDelimiter('-', argv[i]); + const char *string_argv = &argv[i][string_start]; + + const char *equal_pos = strchr(string_argv, '='); + int argv_length = + (int)(equal_pos == 0 ? strlen(string_argv) : equal_pos - string_argv); + + int length = (int)strlen(string_ref); + + if (length == argv_length && + !STRNCASECMP(string_argv, string_ref, length)) { + bFound = true; + continue; + } + } + } + + return bFound; +} + +// This function wraps the CUDA Driver API into a template function +template +inline bool getCmdLineArgumentValue(const int argc, const char **argv, + const char *string_ref, T *value) { + bool bFound = false; + + if (argc >= 1) { + for (int i = 1; i < argc; i++) { + int string_start = stringRemoveDelimiter('-', argv[i]); + const char *string_argv = &argv[i][string_start]; + int length = (int)strlen(string_ref); + + if (!STRNCASECMP(string_argv, string_ref, length)) { + if (length + 1 <= (int)strlen(string_argv)) { + int auto_inc = (string_argv[length] == '=') ? 1 : 0; + *value = (T)atoi(&string_argv[length + auto_inc]); + } + + bFound = true; + i = argc; + } + } + } + + return bFound; +} + +inline int getCmdLineArgumentInt(const int argc, const char **argv, + const char *string_ref) { + bool bFound = false; + int value = -1; + + if (argc >= 1) { + for (int i = 1; i < argc; i++) { + int string_start = stringRemoveDelimiter('-', argv[i]); + const char *string_argv = &argv[i][string_start]; + int length = (int)strlen(string_ref); + + if (!STRNCASECMP(string_argv, string_ref, length)) { + if (length + 1 <= (int)strlen(string_argv)) { + int auto_inc = (string_argv[length] == '=') ? 1 : 0; + value = atoi(&string_argv[length + auto_inc]); + } else { + value = 0; + } + + bFound = true; + continue; + } + } + } + + if (bFound) { + return value; + } else { + return 0; + } +} + +inline float getCmdLineArgumentFloat(const int argc, const char **argv, + const char *string_ref) { + bool bFound = false; + float value = -1; + + if (argc >= 1) { + for (int i = 1; i < argc; i++) { + int string_start = stringRemoveDelimiter('-', argv[i]); + const char *string_argv = &argv[i][string_start]; + int length = (int)strlen(string_ref); + + if (!STRNCASECMP(string_argv, string_ref, length)) { + if (length + 1 <= (int)strlen(string_argv)) { + int auto_inc = (string_argv[length] == '=') ? 1 : 0; + value = (float)atof(&string_argv[length + auto_inc]); + } else { + value = 0.f; + } + + bFound = true; + continue; + } + } + } + + if (bFound) { + return value; + } else { + return 0; + } +} + +inline bool getCmdLineArgumentString(const int argc, const char **argv, + const char *string_ref, + char **string_retval) { + bool bFound = false; + + if (argc >= 1) { + for (int i = 1; i < argc; i++) { + int string_start = stringRemoveDelimiter('-', argv[i]); + char *string_argv = (char *)&argv[i][string_start]; + int length = (int)strlen(string_ref); + + if (!STRNCASECMP(string_argv, string_ref, length)) { + *string_retval = &string_argv[length + 1]; + bFound = true; + continue; + } + } + } + + if (!bFound) { + *string_retval = NULL; + } + + return bFound; +} + +////////////////////////////////////////////////////////////////////////////// +//! Find the path for a file assuming that +//! files are found in the searchPath. +//! +//! @return the path if succeeded, otherwise 0 +//! @param filename name of the file +//! @param executable_path optional absolute path of the executable +////////////////////////////////////////////////////////////////////////////// +inline char *sdkFindFilePath(const char *filename, + const char *executable_path) { + // defines a variable that is replaced with the name of the + // executable + + // Typical relative search paths to locate needed companion files (e.g. sample + // input data, or JIT source files) The origin for the relative search may be + // the .exe file, a .bat file launching an .exe, a browser .exe launching the + // .exe or .bat, etc + const char *searchPath[] = { + "./", // same dir + "./common/", // "/common/" subdir + "./common/data/", // "/common/data/" subdir + "./data/", // "/data/" subdir + "./src/", // "/src/" subdir + "./src//data/", // "/src//data/" subdir + "./inc/", // "/inc/" subdir + "./0_Simple/", // "/0_Simple/" subdir + "./1_Utilities/", // "/1_Utilities/" subdir + "./2_Graphics/", // "/2_Graphics/" subdir + "./3_Imaging/", // "/3_Imaging/" subdir + "./4_Finance/", // "/4_Finance/" subdir + "./5_Simulations/", // "/5_Simulations/" subdir + "./6_Advanced/", // "/6_Advanced/" subdir + "./7_CUDALibraries/", // "/7_CUDALibraries/" subdir + "./8_Android/", // "/8_Android/" subdir + "./samples/", // "/samples/" subdir + + "../", // up 1 in tree + "../common/", // up 1 in tree, "/common/" subdir + "../common/data/", // up 1 in tree, "/common/data/" subdir + "../data/", // up 1 in tree, "/data/" subdir + "../src/", // up 1 in tree, "/src/" subdir + "../inc/", // up 1 in tree, "/inc/" subdir + + "../0_Simple//data/", // up 1 in tree, + // "/0_Simple//" + // subdir + "../1_Utilities//data/", // up 1 in tree, + // "/1_Utilities//" + // subdir + "../2_Graphics//data/", // up 1 in tree, + // "/2_Graphics//" + // subdir + "../3_Imaging//data/", // up 1 in tree, + // "/3_Imaging//" + // subdir + "../4_Finance//data/", // up 1 in tree, + // "/4_Finance//" + // subdir + "../5_Simulations//data/", // up 1 in tree, + // "/5_Simulations//" + // subdir + "../6_Advanced//data/", // up 1 in tree, + // "/6_Advanced//" + // subdir + "../7_CUDALibraries//data/", // up 1 in tree, + // "/7_CUDALibraries//" + // subdir + "../8_Android//data/", // up 1 in tree, + // "/8_Android//" + // subdir + "../samples//data/", // up 1 in tree, + // "/samples//" + // subdir + "../../", // up 2 in tree + "../../common/", // up 2 in tree, "/common/" subdir + "../../common/data/", // up 2 in tree, "/common/data/" subdir + "../../data/", // up 2 in tree, "/data/" subdir + "../../src/", // up 2 in tree, "/src/" subdir + "../../inc/", // up 2 in tree, "/inc/" subdir + "../../sandbox//data/", // up 2 in tree, + // "/sandbox//" + // subdir + "../../0_Simple//data/", // up 2 in tree, + // "/0_Simple//" + // subdir + "../../1_Utilities//data/", // up 2 in tree, + // "/1_Utilities//" + // subdir + "../../2_Graphics//data/", // up 2 in tree, + // "/2_Graphics//" + // subdir + "../../3_Imaging//data/", // up 2 in tree, + // "/3_Imaging//" + // subdir + "../../4_Finance//data/", // up 2 in tree, + // "/4_Finance//" + // subdir + "../../5_Simulations//data/", // up 2 in tree, + // "/5_Simulations//" + // subdir + "../../6_Advanced//data/", // up 2 in tree, + // "/6_Advanced//" + // subdir + "../../7_CUDALibraries//data/", // up 2 in tree, + // "/7_CUDALibraries//" + // subdir + "../../8_Android//data/", // up 2 in tree, + // "/8_Android//" + // subdir + "../../samples//data/", // up 2 in tree, + // "/samples//" + // subdir + "../../../", // up 3 in tree + "../../../src//", // up 3 in tree, + // "/src//" subdir + "../../../src//data/", // up 3 in tree, + // "/src//data/" + // subdir + "../../../src//src/", // up 3 in tree, + // "/src//src/" + // subdir + "../../../src//inc/", // up 3 in tree, + // "/src//inc/" + // subdir + "../../../sandbox//", // up 3 in tree, + // "/sandbox//" + // subdir + "../../../sandbox//data/", // up 3 in tree, + // "/sandbox//data/" + // subdir + "../../../sandbox//src/", // up 3 in tree, + // "/sandbox//src/" + // subdir + "../../../sandbox//inc/", // up 3 in tree, + // "/sandbox//inc/" + // subdir + "../../../0_Simple//data/", // up 3 in tree, + // "/0_Simple//" + // subdir + "../../../1_Utilities//data/", // up 3 in tree, + // "/1_Utilities//" + // subdir + "../../../2_Graphics//data/", // up 3 in tree, + // "/2_Graphics//" + // subdir + "../../../3_Imaging//data/", // up 3 in tree, + // "/3_Imaging//" + // subdir + "../../../4_Finance//data/", // up 3 in tree, + // "/4_Finance//" + // subdir + "../../../5_Simulations//data/", // up 3 in tree, + // "/5_Simulations//" + // subdir + "../../../6_Advanced//data/", // up 3 in tree, + // "/6_Advanced//" + // subdir + "../../../7_CUDALibraries//data/", // up 3 in tree, + // "/7_CUDALibraries//" + // subdir + "../../../8_Android//data/", // up 3 in tree, + // "/8_Android//" + // subdir + "../../../0_Simple//", // up 3 in tree, + // "/0_Simple//" + // subdir + "../../../1_Utilities//", // up 3 in tree, + // "/1_Utilities//" + // subdir + "../../../2_Graphics//", // up 3 in tree, + // "/2_Graphics//" + // subdir + "../../../3_Imaging//", // up 3 in tree, + // "/3_Imaging//" + // subdir + "../../../4_Finance//", // up 3 in tree, + // "/4_Finance//" + // subdir + "../../../5_Simulations//", // up 3 in tree, + // "/5_Simulations//" + // subdir + "../../../6_Advanced//", // up 3 in tree, + // "/6_Advanced//" + // subdir + "../../../7_CUDALibraries//", // up 3 in tree, + // "/7_CUDALibraries//" + // subdir + "../../../8_Android//", // up 3 in tree, + // "/8_Android//" + // subdir + "../../../samples//data/", // up 3 in tree, + // "/samples//" + // subdir + "../../../common/", // up 3 in tree, "../../../common/" subdir + "../../../common/data/", // up 3 in tree, "../../../common/data/" subdir + "../../../data/", // up 3 in tree, "../../../data/" subdir + "../../../../", // up 4 in tree + "../../../../src//", // up 4 in tree, + // "/src//" subdir + "../../../../src//data/", // up 4 in tree, + // "/src//data/" + // subdir + "../../../../src//src/", // up 4 in tree, + // "/src//src/" + // subdir + "../../../../src//inc/", // up 4 in tree, + // "/src//inc/" + // subdir + "../../../../sandbox//", // up 4 in tree, + // "/sandbox//" + // subdir + "../../../../sandbox//data/", // up 4 in tree, + // "/sandbox//data/" + // subdir + "../../../../sandbox//src/", // up 4 in tree, + // "/sandbox//src/" + // subdir + "../../../../sandbox//inc/", // up 4 in tree, + // "/sandbox//inc/" + // subdir + "../../../../0_Simple//data/", // up 4 in tree, + // "/0_Simple//" + // subdir + "../../../../1_Utilities//data/", // up 4 in tree, + // "/1_Utilities//" + // subdir + "../../../../2_Graphics//data/", // up 4 in tree, + // "/2_Graphics//" + // subdir + "../../../../3_Imaging//data/", // up 4 in tree, + // "/3_Imaging//" + // subdir + "../../../../4_Finance//data/", // up 4 in tree, + // "/4_Finance//" + // subdir + "../../../../5_Simulations//data/", // up 4 in tree, + // "/5_Simulations//" + // subdir + "../../../../6_Advanced//data/", // up 4 in tree, + // "/6_Advanced//" + // subdir + "../../../../7_CUDALibraries//data/", // up 4 in tree, + // "/7_CUDALibraries//" + // subdir + "../../../../8_Android//data/", // up 4 in tree, + // "/8_Android//" + // subdir + "../../../../0_Simple//", // up 4 in tree, + // "/0_Simple//" + // subdir + "../../../../1_Utilities//", // up 4 in tree, + // "/1_Utilities//" + // subdir + "../../../../2_Graphics//", // up 4 in tree, + // "/2_Graphics//" + // subdir + "../../../../3_Imaging//", // up 4 in tree, + // "/3_Imaging//" + // subdir + "../../../../4_Finance//", // up 4 in tree, + // "/4_Finance//" + // subdir + "../../../../5_Simulations//", // up 4 in tree, + // "/5_Simulations//" + // subdir + "../../../../6_Advanced//", // up 4 in tree, + // "/6_Advanced//" + // subdir + "../../../../7_CUDALibraries//", // up 4 in tree, + // "/7_CUDALibraries//" + // subdir + "../../../../8_Android//", // up 4 in tree, + // "/8_Android//" + // subdir + "../../../../samples//data/", // up 4 in tree, + // "/samples//" + // subdir + "../../../../common/", // up 4 in tree, "../../../common/" subdir + "../../../../common/data/", // up 4 in tree, "../../../common/data/" + // subdir + "../../../../data/", // up 4 in tree, "../../../data/" subdir + "../../../../../", // up 5 in tree + "../../../../../src//", // up 5 in tree, + // "/src//" + // subdir + "../../../../../src//data/", // up 5 in tree, + // "/src//data/" + // subdir + "../../../../../src//src/", // up 5 in tree, + // "/src//src/" + // subdir + "../../../../../src//inc/", // up 5 in tree, + // "/src//inc/" + // subdir + "../../../../../sandbox//", // up 5 in tree, + // "/sandbox//" + // subdir + "../../../../../sandbox//data/", // up 5 in tree, + // "/sandbox//data/" + // subdir + "../../../../../sandbox//src/", // up 5 in tree, + // "/sandbox//src/" + // subdir + "../../../../../sandbox//inc/", // up 5 in tree, + // "/sandbox//inc/" + // subdir + "../../../../../0_Simple//data/", // up 5 in tree, + // "/0_Simple//" + // subdir + "../../../../../1_Utilities//data/", // up 5 in tree, + // "/1_Utilities//" + // subdir + "../../../../../2_Graphics//data/", // up 5 in tree, + // "/2_Graphics//" + // subdir + "../../../../../3_Imaging//data/", // up 5 in tree, + // "/3_Imaging//" + // subdir + "../../../../../4_Finance//data/", // up 5 in tree, + // "/4_Finance//" + // subdir + "../../../../../5_Simulations//data/", // up 5 in tree, + // "/5_Simulations//" + // subdir + "../../../../../6_Advanced//data/", // up 5 in tree, + // "/6_Advanced//" + // subdir + "../../../../../7_CUDALibraries//data/", // up 5 in tree, + // "/7_CUDALibraries//" + // subdir + "../../../../../8_Android//data/", // up 5 in tree, + // "/8_Android//" + // subdir + "../../../../../samples//data/", // up 5 in tree, + // "/samples//" + // subdir + "../../../../../common/", // up 5 in tree, "../../../common/" subdir + "../../../../../common/data/", // up 5 in tree, "../../../common/data/" + // subdir + }; + + // Extract the executable name + std::string executable_name; + + if (executable_path != 0) { + executable_name = std::string(executable_path); + +#if defined(WIN32) || defined(_WIN32) || defined(WIN64) || defined(_WIN64) + // Windows path delimiter + size_t delimiter_pos = executable_name.find_last_of('\\'); + executable_name.erase(0, delimiter_pos + 1); + + if (executable_name.rfind(".exe") != std::string::npos) { + // we strip .exe, only if the .exe is found + executable_name.resize(executable_name.size() - 4); + } + +#else + // Linux & OSX path delimiter + size_t delimiter_pos = executable_name.find_last_of('/'); + executable_name.erase(0, delimiter_pos + 1); +#endif + } + + // Loop over all search paths and return the first hit + for (unsigned int i = 0; i < sizeof(searchPath) / sizeof(char *); ++i) { + std::string path(searchPath[i]); + size_t executable_name_pos = path.find(""); + + // If there is executable_name variable in the searchPath + // replace it with the value + if (executable_name_pos != std::string::npos) { + if (executable_path != 0) { + path.replace(executable_name_pos, strlen(""), + executable_name); + } else { + // Skip this path entry if no executable argument is given + continue; + } + } + +#ifdef _DEBUG + printf("sdkFindFilePath <%s> in %s\n", filename, path.c_str()); +#endif + + // Test if the file exists + path.append(filename); + FILE *fp; + FOPEN(fp, path.c_str(), "rb"); + + if (fp != NULL) { + fclose(fp); + // File found + // returning an allocated array here for backwards compatibility reasons + char *file_path = (char *)malloc(path.length() + 1); + STRCPY(file_path, path.length() + 1, path.c_str()); + return file_path; + } + + if (fp) { + fclose(fp); + } + } + + // File not found + return 0; +} + +#endif diff --git a/include/keyswitch.h b/include/keyswitch.h new file mode 100644 index 000000000..d74a0f543 --- /dev/null +++ b/include/keyswitch.h @@ -0,0 +1,24 @@ +#ifndef CNCRT_KS_H_ +#define CNCRT_KS_H_ + +#include + +extern "C" { + +void cuda_keyswitch_lwe_ciphertext_vector_32(void *v_stream, void *lwe_out, void *lwe_in, + void *ksk, + uint32_t lwe_dimension_before, + uint32_t lwe_dimension_after, + uint32_t base_log, uint32_t l_gadget, + uint32_t num_samples); + +void cuda_keyswitch_lwe_ciphertext_vector_64(void *v_stream, void *lwe_out, void *lwe_in, + void *ksk, + uint32_t lwe_dimension_before, + uint32_t lwe_dimension_after, + uint32_t base_log, uint32_t l_gadget, + uint32_t num_samples); + +} + +#endif // CNCRT_KS_H_ diff --git a/parameters/CMakeLists.txt b/parameters/CMakeLists.txt new file mode 100644 index 000000000..28e1cf9da --- /dev/null +++ b/parameters/CMakeLists.txt @@ -0,0 +1,4 @@ +file(GLOB SOURCES + "parameters.cpp") +add_library(cuda_parameters STATIC ${SOURCES}) +set_target_properties(cuda_parameters PROPERTIES CUDA_RESOLVE_DEVICE_SYMBOLS ON) diff --git a/parameters/parameters.cpp b/parameters/parameters.cpp new file mode 100644 index 000000000..4795db8bc --- /dev/null +++ b/parameters/parameters.cpp @@ -0,0 +1,380 @@ + + +#include +using namespace std; + +const int NORM2_MAX = 31; +const int P_MAX = 7; + +typedef struct V0Parameter { + int k; + int polynomialSize; + int nSmall; + int brLevel; + int brLogBase; + int ksLevel; + int ksLogBase; + + V0Parameter(int k_, int polynomialSize_, int nSmall_, int brLevel_, + int brLogBase_, int ksLevel_, int ksLogBase_) { + k = k_; + polynomialSize = polynomialSize_; + nSmall = nSmall_; + brLevel = brLevel_; + brLogBase = brLogBase_; + ksLevel = ksLevel_; + ksLogBase = ksLogBase_; + } + +} V0Parameter; + +typedef struct V0Variances { + float logstdEncrypt; + float logstdDecrypt; + + V0Variances(float logstdEncrypt_, float logstdDecrypt_) { + logstdEncrypt = logstdEncrypt_; + logstdDecrypt = logstdDecrypt_; + } + +} V0Variances; + +V0Parameter parameters[NORM2_MAX][P_MAX] = { + {V0Parameter(1, 10, 472, 2, 8, 4, 2), V0Parameter(1, 10, 514, 2, 8, 5, 2), + V0Parameter(1, 10, 564, 2, 8, 5, 2), V0Parameter(1, 10, 599, 3, 6, 6, 2), + V0Parameter(1, 10, 686, 3, 6, 7, 2), V0Parameter(1, 11, 736, 1, 23, 5, 3), + V0Parameter(1, 12, 830, 1, 23, 4, 4)}, + {V0Parameter(1, 10, 474, 2, 8, 4, 2), V0Parameter(1, 10, 519, 2, 8, 5, 2), + V0Parameter(1, 10, 558, 3, 6, 5, 2), V0Parameter(1, 10, 610, 3, 6, 6, 2), + V0Parameter(1, 11, 689, 1, 23, 4, 3), V0Parameter(1, 11, 736, 1, 23, 5, 3), + V0Parameter(1, 12, 831, 1, 23, 4, 4)}, + {V0Parameter(1, 10, 479, 2, 8, 4, 2), V0Parameter(1, 10, 515, 3, 6, 5, 2), + V0Parameter(1, 10, 569, 3, 6, 5, 2), V0Parameter(1, 11, 638, 1, 23, 4, 3), + V0Parameter(1, 11, 689, 1, 23, 4, 3), V0Parameter(1, 11, 737, 1, 23, 5, 3), + V0Parameter(1, 12, 840, 1, 23, 4, 4)}, + {V0Parameter(1, 10, 531, 2, 8, 5, 2), V0Parameter(1, 10, 523, 3, 6, 5, 2), + V0Parameter(1, 11, 598, 1, 23, 4, 3), V0Parameter(1, 11, 639, 1, 23, 4, 3), + V0Parameter(1, 11, 690, 1, 23, 4, 3), V0Parameter(1, 11, 739, 1, 23, 5, 3), + V0Parameter(1, 12, 806, 2, 16, 5, 3)}, + {V0Parameter(1, 10, 483, 3, 6, 4, 2), V0Parameter(1, 11, 563, 1, 23, 3, 3), + V0Parameter(1, 11, 598, 1, 23, 4, 3), V0Parameter(1, 11, 639, 1, 23, 4, 3), + V0Parameter(1, 11, 691, 1, 23, 4, 3), V0Parameter(1, 11, 748, 1, 23, 5, 3), + V0Parameter(1, 12, 806, 2, 15, 5, 3)}, + {V0Parameter(1, 11, 497, 1, 23, 4, 2), V0Parameter(1, 11, 563, 1, 23, 3, 3), + V0Parameter(1, 11, 598, 1, 23, 4, 3), V0Parameter(1, 11, 640, 1, 23, 4, 3), + V0Parameter(1, 11, 699, 1, 23, 4, 3), V0Parameter(1, 11, 736, 2, 15, 5, 3), + V0Parameter(1, 12, 806, 2, 15, 5, 3)}, + {V0Parameter(1, 11, 497, 1, 23, 4, 2), V0Parameter(1, 11, 563, 1, 23, 3, 3), + V0Parameter(1, 11, 599, 1, 23, 4, 3), V0Parameter(1, 11, 643, 1, 23, 4, 3), + V0Parameter(1, 11, 721, 1, 23, 5, 3), V0Parameter(1, 11, 736, 2, 15, 5, 3), + V0Parameter(1, 12, 806, 2, 15, 5, 3)}, + {V0Parameter(1, 11, 497, 1, 23, 4, 2), V0Parameter(1, 11, 564, 1, 23, 3, 3), + V0Parameter(1, 11, 602, 1, 23, 4, 3), V0Parameter(1, 11, 671, 1, 23, 4, 3), + V0Parameter(1, 11, 689, 2, 15, 4, 3), V0Parameter(1, 11, 736, 2, 15, 5, 3), + V0Parameter(1, 12, 807, 2, 15, 5, 3)}, + {V0Parameter(1, 11, 498, 1, 23, 4, 2), V0Parameter(1, 11, 569, 1, 23, 3, 3), + V0Parameter(1, 11, 622, 1, 23, 4, 3), V0Parameter(1, 11, 638, 2, 15, 4, 3), + V0Parameter(1, 11, 689, 2, 16, 4, 3), V0Parameter(1, 11, 736, 2, 16, 5, 3), + V0Parameter(1, 12, 809, 2, 15, 5, 3)}, + {V0Parameter(1, 11, 502, 1, 23, 4, 2), V0Parameter(1, 11, 555, 1, 23, 5, 2), + V0Parameter(1, 11, 579, 2, 15, 5, 2), V0Parameter(1, 11, 638, 2, 15, 4, 3), + V0Parameter(1, 11, 689, 2, 15, 4, 3), V0Parameter(1, 11, 737, 2, 15, 5, 3), + V0Parameter(1, 12, 818, 2, 15, 5, 3)}, + {V0Parameter(1, 11, 537, 1, 23, 3, 3), V0Parameter(1, 11, 532, 2, 15, 5, 2), + V0Parameter(1, 11, 579, 2, 15, 5, 2), V0Parameter(1, 11, 638, 2, 15, 4, 3), + V0Parameter(1, 11, 690, 2, 15, 4, 3), V0Parameter(1, 11, 738, 2, 15, 5, 3), + V0Parameter(1, 12, 832, 2, 15, 9, 2)}, + {V0Parameter(1, 11, 497, 2, 15, 4, 2), V0Parameter(1, 11, 532, 2, 15, 5, 2), + V0Parameter(1, 11, 579, 2, 15, 5, 2), V0Parameter(1, 11, 639, 2, 15, 4, 3), + V0Parameter(1, 11, 691, 2, 15, 4, 3), V0Parameter(1, 11, 743, 2, 16, 5, 3), + V0Parameter(1, 12, 807, 3, 12, 5, 3)}, + {V0Parameter(1, 11, 497, 2, 15, 4, 2), V0Parameter(1, 11, 532, 2, 15, 5, 2), + V0Parameter(1, 11, 579, 2, 16, 5, 2), V0Parameter(1, 11, 639, 2, 15, 4, 3), + V0Parameter(1, 11, 695, 2, 16, 4, 3), + V0Parameter(1, 11, 757, 2, 16, 16, 1), + V0Parameter(1, 12, 811, 3, 12, 5, 3)}, + {V0Parameter(1, 11, 497, 2, 16, 4, 2), V0Parameter(1, 11, 533, 2, 15, 5, 2), + V0Parameter(1, 11, 580, 2, 15, 5, 2), V0Parameter(1, 11, 641, 2, 16, 4, 3), + V0Parameter(1, 11, 699, 2, 16, 5, 3), V0Parameter(1, 11, 737, 3, 12, 5, 3), + V0Parameter(1, 12, 788, 3, 12, 8, 2)}, + {V0Parameter(1, 11, 497, 2, 16, 4, 2), V0Parameter(1, 11, 533, 2, 15, 5, 2), + V0Parameter(1, 11, 583, 2, 16, 5, 2), V0Parameter(1, 11, 653, 2, 16, 4, 3), + V0Parameter(1, 11, 665, 3, 12, 6, 2), V0Parameter(1, 11, 738, 3, 12, 5, 3), + V0Parameter(1, 12, 775, 4, 9, 8, 2)}, + {V0Parameter(1, 11, 498, 2, 15, 4, 2), V0Parameter(1, 11, 535, 2, 16, 5, 2), + V0Parameter(1, 11, 610, 2, 16, 4, 3), V0Parameter(1, 11, 614, 3, 12, 6, 2), + V0Parameter(1, 11, 666, 3, 12, 6, 2), V0Parameter(1, 11, 747, 3, 12, 5, 3), + V0Parameter(1, 12, 782, 4, 9, 8, 2)}, + {V0Parameter(1, 11, 500, 2, 16, 4, 2), V0Parameter(1, 11, 544, 2, 16, 5, 2), + V0Parameter(1, 11, 580, 3, 12, 5, 2), V0Parameter(1, 11, 615, 3, 12, 6, 2), + V0Parameter(1, 11, 661, 3, 12, 7, 2), V0Parameter(1, 11, 715, 4, 9, 7, 2), + V0Parameter(1, 12, 778, 5, 8, 8, 2)}, + {V0Parameter(1, 11, 513, 2, 16, 4, 2), V0Parameter(1, 11, 533, 3, 12, 5, 2), + V0Parameter(1, 11, 581, 3, 12, 5, 2), V0Parameter(1, 11, 618, 3, 12, 6, 2), + V0Parameter(1, 11, 687, 3, 12, 7, 2), V0Parameter(1, 11, 726, 4, 9, 7, 2), + V0Parameter(1, 12, 809, 5, 8, 8, 2)}, + {V0Parameter(1, 11, 497, 3, 12, 4, 2), V0Parameter(1, 11, 533, 3, 12, 5, 2), + V0Parameter(1, 11, 585, 3, 12, 5, 2), V0Parameter(1, 11, 639, 3, 12, 6, 2), + V0Parameter(1, 11, 662, 4, 9, 7, 2), V0Parameter(1, 11, 717, 5, 8, 7, 2), + V0Parameter(1, 12, 820, 6, 7, 9, 2)}, + {V0Parameter(1, 11, 498, 3, 12, 4, 2), V0Parameter(1, 11, 536, 3, 12, 5, 2), + V0Parameter(1, 11, 593, 3, 12, 6, 2), V0Parameter(1, 11, 619, 4, 9, 6, 2), + V0Parameter(1, 11, 693, 4, 9, 7, 2), V0Parameter(1, 11, 737, 5, 8, 7, 2), + V0Parameter(1, 12, 788, 8, 5, 8, 2)}, + {V0Parameter(1, 11, 502, 3, 12, 4, 2), V0Parameter(1, 11, 552, 3, 12, 5, 2), + V0Parameter(1, 11, 585, 4, 9, 5, 2), V0Parameter(1, 11, 644, 4, 9, 6, 2), + V0Parameter(1, 11, 665, 5, 8, 7, 2), V0Parameter(1, 11, 736, 6, 7, 8, 2), + V0Parameter(1, 12, 786, 11, 4, 8, 2)}, + {V0Parameter(1, 11, 508, 3, 12, 5, 2), V0Parameter(1, 11, 536, 4, 9, 5, 2), + V0Parameter(1, 11, 596, 4, 9, 6, 2), V0Parameter(1, 11, 621, 5, 8, 6, 2), + V0Parameter(1, 11, 667, 6, 7, 7, 2), V0Parameter(1, 11, 746, 7, 6, 8, 2), + V0Parameter(1, 12, 798, 14, 3, 9, 2)}, + {V0Parameter(1, 11, 502, 4, 9, 4, 2), V0Parameter(1, 11, 555, 4, 9, 5, 2), + V0Parameter(1, 11, 580, 5, 8, 6, 2), V0Parameter(1, 11, 623, 6, 7, 6, 2), + V0Parameter(1, 11, 669, 7, 6, 7, 2), V0Parameter(1, 11, 723, 11, 4, 7, 2), + V0Parameter(1, 12, 814, 22, 2, 9, 2)}, + {V0Parameter(1, 11, 510, 4, 9, 5, 2), V0Parameter(1, 11, 539, 5, 8, 5, 2), + V0Parameter(1, 11, 636, 5, 8, 6, 2), V0Parameter(1, 11, 625, 7, 6, 6, 2), + V0Parameter(1, 11, 674, 9, 5, 7, 2), V0Parameter(1, 11, 735, 14, 3, 8, 2), + V0Parameter(0, 0, 0, 0, 0, 0, 0)}, + {V0Parameter(1, 11, 498, 5, 8, 5, 2), V0Parameter(1, 11, 579, 5, 8, 6, 2), + V0Parameter(1, 11, 583, 7, 6, 6, 2), V0Parameter(1, 11, 661, 8, 5, 7, 2), + V0Parameter(1, 11, 681, 11, 4, 7, 2), V0Parameter(1, 11, 736, 22, 2, 8, 2), + V0Parameter(0, 0, 0, 0, 0, 0, 0)}, + {V0Parameter(1, 11, 530, 5, 8, 5, 2), V0Parameter(1, 11, 541, 7, 6, 5, 2), + V0Parameter(1, 11, 611, 8, 5, 6, 2), V0Parameter(1, 11, 635, 11, 4, 6, 2), + V0Parameter(1, 11, 704, 15, 3, 7, 2), V0Parameter(0, 0, 0, 0, 0, 0, 0), + V0Parameter(0, 0, 0, 0, 0, 0, 0)}, + {V0Parameter(1, 11, 565, 6, 7, 5, 2), V0Parameter(1, 11, 569, 8, 5, 5, 2), + V0Parameter(1, 11, 590, 11, 4, 6, 2), V0Parameter(1, 11, 647, 15, 3, 7, 2), + V0Parameter(1, 11, 679, 44, 1, 14, 1), V0Parameter(0, 0, 0, 0, 0, 0, 0), + V0Parameter(0, 0, 0, 0, 0, 0, 0)}, + {V0Parameter(1, 11, 520, 8, 5, 5, 2), V0Parameter(1, 11, 549, 11, 4, 5, 2), + V0Parameter(1, 11, 600, 15, 3, 6, 2), + V0Parameter(1, 11, 628, 44, 1, 13, 1), V0Parameter(0, 0, 0, 0, 0, 0, 0), + V0Parameter(0, 0, 0, 0, 0, 0, 0), V0Parameter(0, 0, 0, 0, 0, 0, 0)}, + {V0Parameter(1, 11, 506, 11, 4, 5, 2), V0Parameter(1, 11, 559, 15, 3, 5, 2), + V0Parameter(1, 11, 584, 44, 1, 12, 1), V0Parameter(0, 0, 0, 0, 0, 0, 0), + V0Parameter(0, 0, 0, 0, 0, 0, 0), V0Parameter(0, 0, 0, 0, 0, 0, 0), + V0Parameter(0, 0, 0, 0, 0, 0, 0)}, + {V0Parameter(1, 11, 503, 15, 3, 9, 1), + V0Parameter(1, 11, 594, 23, 2, 12, 1), V0Parameter(0, 0, 0, 0, 0, 0, 0), + V0Parameter(0, 0, 0, 0, 0, 0, 0), V0Parameter(0, 0, 0, 0, 0, 0, 0), + V0Parameter(0, 0, 0, 0, 0, 0, 0), V0Parameter(0, 0, 0, 0, 0, 0, 0)}, + {V0Parameter(1, 11, 545, 22, 2, 11, 1), V0Parameter(0, 0, 0, 0, 0, 0, 0), + V0Parameter(0, 0, 0, 0, 0, 0, 0), V0Parameter(0, 0, 0, 0, 0, 0, 0), + V0Parameter(0, 0, 0, 0, 0, 0, 0), V0Parameter(0, 0, 0, 0, 0, 0, 0), + V0Parameter(0, 0, 0, 0, 0, 0, 0)}}; + +V0Variances variances[NORM2_MAX][P_MAX] = { + {V0Variances(-7.186489389863581, -8.186489389863581), + V0Variances(-7.124998639947563, -8.124998639947563), + V0Variances(-7.058035238345106, -8.058035238345106), + V0Variances(-8.771444355069676, -9.771444355069676), + V0Variances(-8.673618068377664, -9.673618068377664), + V0Variances(-14.282552902365403, -15.282552902365403), + V0Variances(-13.46973411689919, -14.46973411689919)}, + {V0Variances(-6.183439290095372, -8.183439290095372), + V0Variances(-6.118015550365563, -8.118015550365563), + V0Variances(-7.822589795549476, -9.822589795549476), + V0Variances(-7.758317735238947, -9.758317735238947), + V0Variances(-13.330153794041763, -15.330153794041763), + V0Variances(-13.282552902365403, -15.282552902365403), + V0Variances(-12.468865546631157, -14.468865546631157)}, + {V0Variances(-5.175869991676414, -8.175869991676414), + V0Variances(-6.8804361404287775, -9.880436140428777), + V0Variances(-6.808508030310776, -9.808508030310776), + V0Variances(-12.38562757351147, -15.38562757351147), + V0Variances(-12.330153794041763, -15.330153794041763), + V0Variances(-12.281573475846372, -15.281573475846372), + V0Variances(-11.46109512118327, -14.46109512118327)}, + {V0Variances(-4.101526889142427, -8.101526889142427), + V0Variances(-5.869316883340595, -9.869316883340595), + V0Variances(-11.432333043294854, -15.432333043294854), + V0Variances(-11.384497819920412, -15.384497819920412), + V0Variances(-11.329107604561145, -15.329107604561145), + V0Variances(-11.279618603320834, -15.279618603320834), + V0Variances(-17.494100927447505, -21.494100927447505)}, + {V0Variances(-4.926710762046184, -9.926710762046184), + V0Variances(-10.475838324353795, -15.475838324353795), + V0Variances(-10.432333043294854, -15.432333043294854), + V0Variances(-10.384497819920412, -15.384497819920412), + V0Variances(-10.328062930199778, -15.328062930199778), + V0Variances(-10.270886650450088, -15.270886650450088), + V0Variances(-16.68961710493341, -21.68961710493341)}, + {V0Variances(-9.565782859612767, -15.565782859612767), + V0Variances(-9.475838324353795, -15.475838324353795), + V0Variances(-9.432333043294854, -15.432333043294854), + V0Variances(-9.38336983295023, -15.38336983295023), + V0Variances(-9.319759557706192, -15.319759557706192), + V0Variances(-16.395716120060897, -22.395716120060897), + V0Variances(-15.689617104933411, -21.68961710493341)}, + {V0Variances(-8.565782859612767, -15.565782859612767), + V0Variances(-8.475838324353795, -15.475838324353795), + V0Variances(-8.431127783999514, -15.431127783999514), + V0Variances(-8.37999641672993, -15.37999641672993), + V0Variances(-8.297406155773494, -15.297406155773494), + V0Variances(-15.395716120060897, -22.395716120060897), + V0Variances(-14.689617104933411, -21.68961710493341)}, + {V0Variances(-7.565782859612767, -15.565782859612767), + V0Variances(-7.4745582041945084, -15.474558204194508), + V0Variances(-7.427524042014056, -15.427524042014056), + V0Variances(-7.349249402293815, -15.349249402293815), + V0Variances(-14.443317011737257, -22.443317011737257), + V0Variances(-14.395716120060897, -22.395716120060897), + V0Variances(-13.688722687558503, -21.688722687558503)}, + {V0Variances(-6.564332914359866, -15.564332914359866), + V0Variances(-6.4681914592406144, -15.468191459240614), + V0Variances(-6.403948495328606, -15.403948495328606), + V0Variances(-13.498790791206964, -22.498790791206964), + V0Variances(-13.669055725537874, -22.669055725537874), + V0Variances(-13.621454833861513, -22.621454833861513), + V0Variances(-12.686937172982404, -21.686937172982404)}, + {V0Variances(-5.558562103418524, -15.558562103418524), + V0Variances(-5.486161899775176, -15.486161899775176), + V0Variances(-12.568787329094782, -22.568787329094782), + V0Variances(-12.498790791206964, -22.498790791206964), + V0Variances(-12.443317011737257, -22.443317011737257), + V0Variances(-12.394736693541866, -22.394736693541866), + V0Variances(-11.678956602726522, -21.678956602726522)}, + {V0Variances(-4.509944741401199, -15.509944741401199), + V0Variances(-11.629855880338809, -22.62985588033881), + V0Variances(-11.568787329094782, -22.568787329094782), + V0Variances(-11.498790791206964, -22.498790791206964), + V0Variances(-11.442270822256638, -22.44227082225664), + V0Variances(-11.393758595059204, -22.393758595059204), + V0Variances(-10.66671526012685, -21.66671526012685)}, + {V0Variances(-10.678946077308261, -22.67894607730826), + V0Variances(-10.629855880338809, -22.62985588033881), + V0Variances(-10.568787329094782, -22.568787329094782), + V0Variances(-10.497661037615906, -22.497661037615906), + V0Variances(-10.441226147895271, -22.44122614789527), + V0Variances(-10.614626611620722, -22.61462661162072), + V0Variances(-13.208593433538631, -25.20859343353863)}, + {V0Variances(-9.678946077308261, -22.67894607730826), + V0Variances(-9.629855880338809, -22.62985588033881), + V0Variances(-9.794526042895399, -22.7945260428954), + V0Variances(-9.497661037615906, -22.497661037615906), + V0Variances(-9.662801228084582, -22.662801228084582), + V0Variances(-9.601161066897156, -22.601161066897156), + V0Variances(-12.205026813068883, -25.205026813068883)}, + {V0Variances(-8.904684791108878, -22.904684791108878), + V0Variances(-8.628501236709816, -22.628501236709816), + V0Variances(-8.567542553081935, -22.567542553081935), + V0Variances(-8.72114553858065, -22.72114553858065), + V0Variances(-8.658661489202302, -22.658661489202302), + V0Variances(-12.345258643192501, -26.3452586431925), + V0Variances(-11.225779955449333, -25.225779955449333)}, + {V0Variances(-7.904684791108878, -22.904684791108878), + V0Variances(-7.628501236709816, -22.628501236709816), + V0Variances(-7.789559775289774, -22.789559775289774), + V0Variances(-7.707766221116806, -22.707766221116806), + V0Variances(-11.41941378254576, -26.41941378254576), + V0Variances(-11.34428054470984, -26.34428054470984), + V0Variances(-12.519191629935513, -27.519191629935513)}, + {V0Variances(-6.67749613205536, -22.67749613205536), + V0Variances(-6.851538271245765, -22.851538271245765), + V0Variances(-6.756903095664896, -22.756903095664896), + V0Variances(-10.476971625054944, -26.476971625054944), + V0Variances(-10.418329864204402, -26.418329864204402), + V0Variances(-10.335536831345415, -26.335536831345415), + V0Variances(-11.512705481362637, -27.512705481362637)}, + {V0Variances(-5.900343669558978, -22.90034366955898), + V0Variances(-5.839504391264846, -22.839504391264846), + V0Variances(-9.518064502732571, -26.51806450273257), + V0Variances(-9.475797747626736, -26.475797747626736), + V0Variances(-9.42376581698619, -26.42376581698619), + V0Variances(-11.303434156979073, -28.303434156979073), + V0Variances(-11.872866817284404, -28.872866817284404)}, + {V0Variances(-4.88182830408649, -22.88182830408649), + V0Variances(-8.579023186360452, -26.579023186360452), + V0Variances(-8.51682187103777, -26.51682187103777), + V0Variances(-8.47228753378785, -26.47228753378785), + V0Variances(-8.395935903330987, -26.395935903330987), + V0Variances(-10.292421003814077, -28.292421003814077), + V0Variances(-10.844682043562514, -28.844682043562514)}, + {V0Variances(-7.629468026958897, -26.629468026958897), + V0Variances(-7.579023186360452, -26.579023186360452), + V0Variances(-7.511872640504656, -26.511872640504656), + V0Variances(-7.4481829872665415, -26.44818298726654), + V0Variances(-9.358990169408344, -28.358990169408344), + V0Variances(-11.010736901553656, -30.010736901553656), + V0Variances(-10.711045072243067, -29.711045072243067)}, + {V0Variances(-6.628018081705996, -26.628018081705996), + V0Variances(-6.5749744525111495, -26.57497445251115), + V0Variances(-6.502074900467036, -26.502074900467036), + V0Variances(-8.40743607320482, -28.40743607320482), + V0Variances(-8.325978101743345, -28.325978101743345), + V0Variances(-9.990891151357076, -29.990891151357076), + V0Variances(-11.223620949776631, -31.22362094977663)}, + {V0Variances(-5.622247270764653, -26.622247270764653), + V0Variances(-5.5537568193509514, -26.55375681935095), + V0Variances(-7.4481874655765665, -28.448187465576567), + V0Variances(-7.378875433754644, -28.378875433754644), + V0Variances(-9.065046290710335, -30.065046290710335), + V0Variances(-9.877481950164196, -30.877481950164196), + V0Variances(-11.301978588237922, -32.30197858823793)}, + {V0Variances(-4.613676704353956, -26.613676704353956), + V0Variances(-6.511289277583067, -28.511289277583067), + V0Variances(-6.434749612580873, -28.434749612580873), + V0Variances(-8.114426826794364, -30.114426826794364), + V0Variances(-8.948491452600415, -30.948491452600415), + V0Variances(-9.745555749635251, -31.74555574963525), + V0Variances(-10.928045032645045, -32.928045032645045)}, + {V0Variances(-5.558562095836564, -28.558562095836564), + V0Variances(-5.486161892193216, -28.486161892193216), + V0Variances(-7.163697010897138, -30.16369701089714), + V0Variances(-7.997718751680708, -30.997718751680708), + V0Variances(-8.824140459442134, -31.824140459442134), + V0Variances(-10.447705621458134, -33.447705621458134), + V0Variances(-10.746667774832375, -33.746667774832375)}, + {V0Variances(-4.547157154382525, -28.547157154382525), + V0Variances(-6.216580824528357, -30.216580824528357), + V0Variances(-6.097210078262428, -30.097210078262428), + V0Variances(-7.873215469988139, -31.87321546998814), + V0Variances(-8.652284365210448, -32.65228436521045), + V0Variances(-9.889772718943199, -33.8897727189432), V0Variances(0, 0)}, + {V0Variances(-5.27365058987057, -30.27365058987057), + V0Variances(-5.164941786909992, -30.164941786909992), + V0Variances(-6.9233956231626195, -31.92339562316262), + V0Variances(-7.176178241418846, -32.17617824141885), + V0Variances(-8.490876045927656, -33.490876045927656), + V0Variances(-9.868458351961102, -34.86845835196111), V0Variances(0, 0)}, + {V0Variances(-4.228727281179324, -30.228727281179324), + V0Variances(-5.977329267849463, -31.977329267849463), + V0Variances(-6.232917187263332, -32.232917187263325), + V0Variances(-7.541325149103926, -33.541325149103926), + V0Variances(-8.245745876084897, -34.2457458760849), V0Variances(0, 0), + V0Variances(0, 0)}, + {V0Variances(-4.068209399541431, -31.06820939954143), + V0Variances(-5.284289051019407, -32.2842890510194), + V0Variances(-6.59434596780909, -33.59434596780909), + V0Variances(-7.306650734407292, -34.30665073440729), + V0Variances(-8.356857016386314, -35.356857016386314), V0Variances(0, 0), + V0Variances(0, 0)}, + {V0Variances(-4.349247565658466, -32.349247565658466), + V0Variances(-5.646300370431092, -33.64630037043109), + V0Variances(-6.361052340155609, -34.36105234015561), + V0Variances(-7.4131805240628665, -35.41318052406287), V0Variances(0, 0), + V0Variances(0, 0), V0Variances(0, 0)}, + {V0Variances(-4.705134752586538, -33.70513475258654), + V0Variances(-5.412109448981951, -34.41210944898195), + V0Variances(-6.465578619068673, -35.46557861906867), V0Variances(0, 0), + V0Variances(0, 0), V0Variances(0, 0), V0Variances(0, 0)}, + {V0Variances(-4.488254390500785, -34.488254390500785), + V0Variances(-5.062180911982956, -35.062180911982956), V0Variances(0, 0), + V0Variances(0, 0), V0Variances(0, 0), V0Variances(0, 0), + V0Variances(0, 0)}, + {V0Variances(-4.085183120157467, -35.08518312015747), V0Variances(0, 0), + V0Variances(0, 0), V0Variances(0, 0), V0Variances(0, 0), V0Variances(0, 0), + V0Variances(0, 0)}}; + +extern "C" V0Parameter *get_parameters(int norm, int p) { + // - 1 is an offset as norm and p are in [1, ...] and not [0, ...] + return ¶meters[norm - 1][p - 1]; +} + +extern "C" V0Variances *get_variances(int norm, int p) { + // - 1 is an offset as norm and p are in [1, ...] and not [0, ...] + return &variances[norm - 1][p - 1]; +} diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 000000000..5260a879e --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,10 @@ +set(SOURCES ${CMAKE_SOURCE_DIR}/${INCLUDE_DIR}/bootstrap.h + ${CMAKE_SOURCE_DIR}/${INCLUDE_DIR}/keyswitch.h) +file(GLOB SOURCES + "*.cu" + "*.h" + "fft/*.cu") +add_library(concrete_cuda STATIC ${SOURCES}) +set_target_properties(concrete_cuda PROPERTIES CUDA_SEPARABLE_COMPILATION ON CUDA_RESOLVE_DEVICE_SYMBOLS ON) +target_link_libraries(concrete_cuda PUBLIC cudart) +target_include_directories(concrete_cuda PRIVATE .) diff --git a/src/bootstrap.cu b/src/bootstrap.cu new file mode 100644 index 000000000..4cc29e0b8 --- /dev/null +++ b/src/bootstrap.cu @@ -0,0 +1 @@ +#include "crypto/bootstrapping_key.cuh" diff --git a/src/bootstrap_amortized.cu b/src/bootstrap_amortized.cu new file mode 100644 index 000000000..15647b4bc --- /dev/null +++ b/src/bootstrap_amortized.cu @@ -0,0 +1,174 @@ +#include "bootstrap_amortized.cuh" + +/* Perform bootstrapping on a batch of input LWE ciphertexts + * + * - lwe_out: output batch of num_samples bootstrapped ciphertexts c = + * (a0,..an-1,b) where n is the LWE dimension + * - lut_vector: should hold as many test vectors of size polynomial_size + * as there are input ciphertexts, but actually holds + * num_lut_vectors vectors to reduce memory usage + * - lut_vector_indexes: stores the index corresponding to + * which test vector to use for each sample in + * lut_vector + * - lwe_in: input batch of num_samples LWE ciphertexts, containing n + * mask values + 1 body value + * - bootstrapping_key: RGSW encryption of the LWE secret key sk1 + * under secret key sk2 + * bsk = Z + sk1 H + * where H is the gadget matrix and Z is a matrix (k+1).l + * containing GLWE encryptions of 0 under sk2. + * bsk is thus a tensor of size (k+1)^2.l.N.n + * where l is the number of decomposition levels and + * k is the GLWE dimension, N is the polynomial size for + * GLWE. The polynomial size for GLWE and the test vector + * are the same because they have to be in the same ring + * to be multiplied. + * Note: it is necessary to generate (k+1).k.l.N.n + * uniformly random coefficients for the zero encryptions + * - input_lwe_dimension: size of the Torus vector used to encrypt the input + * LWE ciphertexts - referred to as n above (~ 600) + * - polynomial_size: size of the test polynomial (test vector) and size of the + * GLWE polynomial (~1024) + * - base_log: log base used for the gadget matrix - B = 2^base_log (~8) + * - l_gadget: number of decomposition levels in the gadget matrix (~4) + * - num_samples: number of encrypted input messages + * - num_lut_vectors: parameter to set the actual number of test vectors to be + * used + * - q: number of bytes in the integer representation (32 or 64) + * + * This function calls a wrapper to a device kernel that performs the + * bootstrapping: + * - the kernel is templatized based on integer discretization and + * polynomial degree + * - num_samples blocks of threads are launched, where each thread is going + * to handle one or more polynomial coefficients at each stage: + * - perform the blind rotation + * - round the result + * - decompose into l_gadget levels, then for each level: + * - switch to the FFT domain + * - multiply with the bootstrapping key + * - come back to the coefficients representation + * - between each stage a synchronization of the threads is necessary + * - in case the device has enough shared memory, temporary arrays used for + * the different stages (accumulators) are stored into the shared memory + * - the accumulators serve to combine the results for all decomposition + * levels + * - the constant memory (64K) is used for storing the roots of identity + * values for the FFT + */ + +void cuda_bootstrap_amortized_lwe_ciphertext_vector_32( + void *v_stream, + void *lwe_out, + void *lut_vector, + void *lut_vector_indexes, + void *lwe_in, + void *bootstrapping_key, + uint32_t input_lwe_dimension, + uint32_t polynomial_size, + uint32_t base_log, + uint32_t l_gadget, + uint32_t num_samples, + uint32_t num_lut_vectors, + uint32_t lwe_idx, + uint32_t max_shared_memory) { + + switch (polynomial_size) { + case 512: + host_bootstrap_amortized>( + v_stream, (uint32_t *)lwe_out, (uint32_t *)lut_vector, + (uint32_t *)lut_vector_indexes, (uint32_t *)lwe_in, + (double2 *)bootstrapping_key, input_lwe_dimension, polynomial_size, + base_log, l_gadget, num_samples, + num_lut_vectors, lwe_idx, max_shared_memory); + break; + case 1024: + host_bootstrap_amortized>( + v_stream, (uint32_t *)lwe_out, (uint32_t *)lut_vector, + (uint32_t *)lut_vector_indexes, (uint32_t *)lwe_in, + (double2 *)bootstrapping_key, input_lwe_dimension, polynomial_size, base_log, l_gadget, num_samples, + num_lut_vectors, lwe_idx, max_shared_memory); + break; + case 2048: + host_bootstrap_amortized>( + v_stream, (uint32_t *)lwe_out, (uint32_t *)lut_vector, + (uint32_t *)lut_vector_indexes, (uint32_t *)lwe_in, + (double2 *)bootstrapping_key, input_lwe_dimension, polynomial_size, base_log, l_gadget, num_samples, + num_lut_vectors, lwe_idx, max_shared_memory); + break; + case 4096: + host_bootstrap_amortized>( + v_stream, (uint32_t *)lwe_out, (uint32_t *)lut_vector, + (uint32_t *)lut_vector_indexes, (uint32_t *)lwe_in, + (double2 *)bootstrapping_key, input_lwe_dimension, polynomial_size, base_log, l_gadget, num_samples, + num_lut_vectors, lwe_idx, max_shared_memory); + break; + case 8192: + host_bootstrap_amortized>( + v_stream, (uint32_t *)lwe_out, (uint32_t *)lut_vector, + (uint32_t *)lut_vector_indexes, (uint32_t *)lwe_in, + (double2 *)bootstrapping_key, input_lwe_dimension, polynomial_size, base_log, l_gadget, num_samples, + num_lut_vectors, lwe_idx, max_shared_memory); + break; + default: + break; + } +} + +void cuda_bootstrap_amortized_lwe_ciphertext_vector_64( + void *v_stream, + void *lwe_out, + void *lut_vector, + void *lut_vector_indexes, + void *lwe_in, + void *bootstrapping_key, + uint32_t input_lwe_dimension, + uint32_t polynomial_size, + uint32_t base_log, + uint32_t l_gadget, + uint32_t num_samples, + uint32_t num_lut_vectors, + uint32_t lwe_idx, + uint32_t max_shared_memory) { + + switch (polynomial_size) { + case 512: + host_bootstrap_amortized>( + v_stream, (uint64_t *)lwe_out, (uint64_t *)lut_vector, + (uint32_t *)lut_vector_indexes, (uint64_t *)lwe_in, + (double2 *)bootstrapping_key, input_lwe_dimension, polynomial_size, + base_log, l_gadget, num_samples, + num_lut_vectors, lwe_idx, max_shared_memory); + break; + case 1024: + host_bootstrap_amortized>( + v_stream, (uint64_t *)lwe_out, (uint64_t *)lut_vector, + (uint32_t *)lut_vector_indexes, (uint64_t *)lwe_in, + (double2 *)bootstrapping_key, input_lwe_dimension, polynomial_size, base_log, l_gadget, num_samples, + num_lut_vectors, lwe_idx, max_shared_memory); + break; + case 2048: + host_bootstrap_amortized>( + v_stream, (uint64_t *)lwe_out, (uint64_t *)lut_vector, + (uint32_t *)lut_vector_indexes, (uint64_t *)lwe_in, + (double2 *)bootstrapping_key, input_lwe_dimension, polynomial_size, base_log, l_gadget, num_samples, + num_lut_vectors, lwe_idx, max_shared_memory); + break; + case 4096: + host_bootstrap_amortized>( + v_stream, (uint64_t *)lwe_out, (uint64_t *)lut_vector, + (uint32_t *)lut_vector_indexes, (uint64_t *)lwe_in, + (double2 *)bootstrapping_key, input_lwe_dimension, polynomial_size, base_log, l_gadget, num_samples, + num_lut_vectors, lwe_idx, max_shared_memory); + break; + case 8192: + host_bootstrap_amortized>( + v_stream, (uint64_t *)lwe_out, (uint64_t *)lut_vector, + (uint32_t *)lut_vector_indexes, (uint64_t *)lwe_in, + (double2 *)bootstrapping_key, input_lwe_dimension, polynomial_size, base_log, l_gadget, num_samples, + num_lut_vectors, lwe_idx, max_shared_memory); + break; + default: + break; + } +} diff --git a/src/bootstrap_amortized.cuh b/src/bootstrap_amortized.cuh new file mode 100644 index 000000000..522c84caf --- /dev/null +++ b/src/bootstrap_amortized.cuh @@ -0,0 +1,466 @@ +#ifdef __CDT_PARSER__ +#undef __CUDA_RUNTIME_H__ +#include +#include +#endif + +#ifndef CNCRT_AMORTIZED_PBS_H +#define CNCRT_AMORTIZED_PBS_H + +#include "cooperative_groups.h" + +#include "../include/helper_cuda.h" +#include "bootstrap.h" +#include "complex/operations.cuh" +//#include "crypto/bootstrapping_key.cuh" +#include "crypto/gadget.cuh" +#include "crypto/torus.cuh" +#include "fft/bnsmfft.cuh" +#include "fft/smfft.cuh" +#include "fft/twiddles.cuh" +#include "polynomial/functions.cuh" +#include "polynomial/parameters.cuh" +#include "polynomial/polynomial.cuh" +#include "polynomial/polynomial_math.cuh" +#include "utils/memory.cuh" +#include "utils/timer.cuh" + +template +/* + * Kernel launched by host_bootstrap_amortized + * + * Uses shared memory to increase performance + * - lwe_out: output batch of num_samples bootstrapped ciphertexts c = + * (a0,..an-1,b) where n is the LWE dimension + * - lut_vector: should hold as many test vectors of size polynomial_size + * as there are input ciphertexts, but actually holds + * num_lut_vectors vectors to reduce memory usage + * - lut_vector_indexes: stores the index corresponding to which test vector + * to use for each sample in lut_vector + * - lwe_in: input batch of num_samples LWE ciphertexts, containing n mask + * values + 1 body value + * - bootstrapping_key: RGSW encryption of the LWE secret key sk1 under secret + * key sk2 + * - device_mem: pointer to the device's global memory in case we use it (SMD + * == NOSM or PARTIALSM) + * - lwe_mask_size: size of the Torus vector used to encrypt the input + * LWE ciphertexts - referred to as n above (~ 600) + * - polynomial_size: size of the test polynomial (test vector) and size of the + * GLWE polynomial (~1024) + * - base_log: log base used for the gadget matrix - B = 2^base_log (~8) + * - l_gadget: number of decomposition levels in the gadget matrix (~4) + * - gpu_num: index of the current GPU (useful for multi-GPU computations) + * - lwe_idx: equal to the number of samples per gpu x gpu_num + * - device_memory_size_per_sample: amount of global memory to allocate if SMD + * is not FULLSM + */ +__global__ void device_bootstrap_amortized( + Torus *lwe_out, + Torus *lut_vector, + uint32_t *lut_vector_indexes, + Torus *lwe_in, + double2 *bootstrapping_key, + char *device_mem, + uint32_t lwe_mask_size, + uint32_t polynomial_size, + uint32_t base_log, + uint32_t l_gadget, + uint32_t lwe_idx, + size_t device_memory_size_per_sample) { + // We use shared memory for the polynomials that are used often during the + // bootstrap, since shared memory is kept in L1 cache and accessing it is + // much faster than global memory + extern __shared__ char sharedmem[]; + char *selected_memory; + + if constexpr (SMD == FULLSM) + selected_memory = sharedmem; + else + selected_memory = &device_mem[blockIdx.x * device_memory_size_per_sample]; + + // For GPU bootstrapping the RLWE dimension is hard-set to 1: there is only + // one mask polynomial and 1 body to handle Also, since the decomposed + // polynomials take coefficients between -B/2 and B/2 they can be represented + // with only 16 bits, assuming the base log does not exceed 2^16 + int16_t *accumulator_mask_decomposed = (int16_t *)selected_memory; + // TODO (Agnes) why not the 16 bits representation here? + int16_t *accumulator_body_decomposed = + (int16_t *)accumulator_mask_decomposed + polynomial_size; + Torus *accumulator_mask = (Torus *)accumulator_body_decomposed + + polynomial_size / (sizeof(Torus) / sizeof(int16_t)); + Torus *accumulator_body = + (Torus *)accumulator_mask + (ptrdiff_t)polynomial_size; + Torus *accumulator_mask_rotated = + (Torus *)accumulator_body + (ptrdiff_t)polynomial_size; + Torus *accumulator_body_rotated = + (Torus *)accumulator_mask_rotated + (ptrdiff_t)polynomial_size; + double2 *mask_res_fft = (double2 *)accumulator_body_rotated + + polynomial_size / (sizeof(double2) / sizeof(Torus)); + double2 *body_res_fft = + (double2 *)mask_res_fft + (ptrdiff_t)polynomial_size / 2; + double2 *accumulator_fft = (double2 *)sharedmem; + if constexpr (SMD != PARTIALSM) + accumulator_fft = + (double2 *)body_res_fft + (ptrdiff_t)(polynomial_size / 2); + + /* + int dif0 = ((char*)accumulator_body_decomposed - (char*)selected_memory); + int dif1 = ((char*)accumulator_mask - (char*)accumulator_body_decomposed); + int dif2 = ((char*)accumulator_body - (char*)accumulator_mask); + int dif3 = ((char*)accumulator_mask_rotated - (char*)accumulator_body); + int dif4 = ((char*)accumulator_body_rotated - + (char*)accumulator_mask_rotated); int dif5 = ((char*)mask_res_fft - + (char*)accumulator_body_rotated); int dif6 = ((char*)body_res_fft - + (char*)mask_res_fft); int dif7 = (SMD != PARTIALSM)? (char*)accumulator_fft - + (char*)body_res_fft:0; if (threadIdx.x == 0 && blockIdx.x == 0) { + printf("device and shared mem: %d %d %d %d %d %d %d %d\n ",dif0, dif1, dif2, + dif3, dif4, dif5, dif6, dif7); + } + */ + + auto block_lwe_in = &lwe_in[blockIdx.x * (lwe_mask_size + 1)]; + Torus *block_lut_vector = + &lut_vector[lut_vector_indexes[lwe_idx + blockIdx.x] * params::degree * 2]; + + // TODO (Agnes) try to store the gadget matrix in const memory to see if + // register use decreases Since all const mem is used for twiddles currently, + // it would mean moving some of them to global memory instead + GadgetMatrix gadget(base_log, l_gadget); + + // Put "b", the body, in [0, 2N[ + Torus b_hat = rescale_torus_element( + block_lwe_in[lwe_mask_size], + 2 * params::degree); // 2 * params::log2_degree + 1); + + divide_by_monomial_negacyclic_inplace( + accumulator_mask, block_lut_vector, b_hat, false); + + divide_by_monomial_negacyclic_inplace( + accumulator_body, &block_lut_vector[params::degree], b_hat, false); + + // Loop over all the mask elements of the sample to accumulate + // (X^a_i-1) multiplication, decomposition of the resulting polynomial + // into l_gadget polynomials, and performing polynomial multiplication + // via an FFT with the RGSW encrypted secret key + for (int iteration = 0; iteration < lwe_mask_size; iteration++) { + // TODO make sure that following sync is necessary + synchronize_threads_in_block(); + + // Put "a" in [0, 2N[ instead of Zq + Torus a_hat = rescale_torus_element( + block_lwe_in[iteration], + 2 * params::degree); // 2 * params::log2_degree + 1); + + // TODO (Agnes) why is there this if condition? + if (a_hat == 0) { + // todo(Joao): **cannot use this optimization** + // the reason is that one of the input ciphertexts (blockIdx.z) + // might skip an iteration while others don't, which as a result + // will make that block not call the grid.sync(), causing a deadlock; + // maybe it's a workaround to add grid.sync() here, but not sure if + // there are any edge cases? + + // continue + } + + // Perform ACC * (X^ä - 1) + multiply_by_monomial_negacyclic_and_sub_polynomial< + Torus, params::opt, params::degree / params::opt>( + accumulator_mask, accumulator_mask_rotated, a_hat); + + multiply_by_monomial_negacyclic_and_sub_polynomial< + Torus, params::opt, params::degree / params::opt>( + accumulator_body, accumulator_body_rotated, a_hat); + + synchronize_threads_in_block(); + + // Perform a rounding to increase the accuracy of the + // bootstrapped ciphertext + round_to_closest_multiple_inplace( + accumulator_mask_rotated, base_log, l_gadget); + + round_to_closest_multiple_inplace( + accumulator_body_rotated, base_log, l_gadget); + // Initialize the polynomial multiplication via FFT arrays + // The polynomial multiplications happens at the block level + // and each thread handles two or more coefficients + int pos = threadIdx.x; + for (int j = 0; j < params::opt / 2; j++) { + mask_res_fft[pos].x = 0; + mask_res_fft[pos].y = 0; + body_res_fft[pos].x = 0; + body_res_fft[pos].y = 0; + pos += params::degree / params::opt; + } + + // Now that the rotation is done, decompose the resulting polynomial + // coefficients so as to multiply each decomposed level with the + // corresponding part of the bootstrapping key + // TODO (Agnes) explain why we do that for the mask and body separately + for (int decomp_level = 0; decomp_level < l_gadget; decomp_level++) { + + gadget.decompose_one_level(accumulator_mask_decomposed, + accumulator_mask_rotated, decomp_level); + + gadget.decompose_one_level(accumulator_body_decomposed, + accumulator_body_rotated, decomp_level); + + synchronize_threads_in_block(); + + // First, perform the polynomial multiplication for the mask + + // Reduce the size of the FFT to be performed by storing + // the real-valued polynomial into a complex polynomial + real_to_complex_compressed(accumulator_mask_decomposed, + accumulator_fft); + + synchronize_threads_in_block(); + // Switch to the FFT space + NSMFFT_direct>(accumulator_fft); + synchronize_threads_in_block(); + + correction_direct_fft_inplace(accumulator_fft); + + // Get the bootstrapping key piece necessary for the multiplication + // It is already in the Fourier domain + // TODO (Agnes) Explain why for the mask polynomial multiplication + // we need the bsk_body_slice and vice versa + auto bsk_mask_slice = PolynomialFourier( + get_ith_mask_kth_block( + bootstrapping_key, iteration, 0, decomp_level, + polynomial_size, 1, l_gadget)); + auto bsk_body_slice = PolynomialFourier( + get_ith_body_kth_block( + bootstrapping_key, iteration, 0, decomp_level, + polynomial_size, 1, l_gadget)); + + synchronize_threads_in_block(); + + // Perform the coefficient-wise product with the two pieces of + // bootstrapping key TODO (Agnes) why two pieces? + polynomial_product_accumulate_in_fourier_domain( + mask_res_fft, accumulator_fft, bsk_mask_slice); + polynomial_product_accumulate_in_fourier_domain( + body_res_fft, accumulator_fft, bsk_body_slice); + + synchronize_threads_in_block(); + + // Now handle the polynomial multiplication for the body + // in the same way + real_to_complex_compressed(accumulator_body_decomposed, + accumulator_fft); + synchronize_threads_in_block(); + + NSMFFT_direct>(accumulator_fft); + synchronize_threads_in_block(); + + correction_direct_fft_inplace(accumulator_fft); + + auto bsk_mask_slice_2 = PolynomialFourier( + get_ith_mask_kth_block(bootstrapping_key, iteration, 1, decomp_level, + polynomial_size, 1, l_gadget)); + auto bsk_body_slice_2 = PolynomialFourier( + get_ith_body_kth_block(bootstrapping_key, iteration, 1, decomp_level, + polynomial_size, 1, l_gadget)); + + synchronize_threads_in_block(); + + polynomial_product_accumulate_in_fourier_domain( + mask_res_fft, accumulator_fft, bsk_mask_slice_2); + polynomial_product_accumulate_in_fourier_domain( + body_res_fft, accumulator_fft, bsk_body_slice_2); + } + + // Come back to the coefficient representation + if constexpr (SMD == FULLSM || SMD == NOSM) { + synchronize_threads_in_block(); + + correction_inverse_fft_inplace(mask_res_fft); + correction_inverse_fft_inplace(body_res_fft); + synchronize_threads_in_block(); + + NSMFFT_inverse>(mask_res_fft); + NSMFFT_inverse>(body_res_fft); + + synchronize_threads_in_block(); + + add_to_torus(mask_res_fft, accumulator_mask); + add_to_torus(body_res_fft, accumulator_body); + synchronize_threads_in_block(); + } else { + int tid = threadIdx.x; +#pragma unroll + for (int i = 0; i < params::opt / 2; i++) { + accumulator_fft[tid] = mask_res_fft[tid]; + tid = tid + params::degree / params::opt; + } + synchronize_threads_in_block(); + + correction_inverse_fft_inplace(accumulator_fft); + synchronize_threads_in_block(); + + NSMFFT_inverse>(accumulator_fft); + synchronize_threads_in_block(); + + add_to_torus(accumulator_fft, accumulator_mask); + synchronize_threads_in_block(); + + tid = threadIdx.x; +#pragma unroll + for (int i = 0; i < params::opt / 2; i++) { + accumulator_fft[tid] = body_res_fft[tid]; + tid = tid + params::degree / params::opt; + } + synchronize_threads_in_block(); + + correction_inverse_fft_inplace(accumulator_fft); + synchronize_threads_in_block(); + + NSMFFT_inverse>(accumulator_fft); + synchronize_threads_in_block(); + + add_to_torus(accumulator_fft, accumulator_body); + synchronize_threads_in_block(); + } + } + + auto block_lwe_out = &lwe_out[blockIdx.x * (polynomial_size + 1)]; + + // The blind rotation for this block is over + // Now we can perform the sample extraction: for the body it's just + // the resulting constant coefficient of the accumulator + // For the mask it's more complicated TODO (Agnes) explain why + sample_extract_mask(block_lwe_out, accumulator_mask); + sample_extract_body(block_lwe_out, accumulator_body); +} + +template +__host__ void host_bootstrap_amortized( + void *v_stream, + Torus *lwe_out, + Torus *lut_vector, + uint32_t *lut_vector_indexes, + Torus *lwe_in, + double2 *bootstrapping_key, + uint32_t input_lwe_dimension, + uint32_t polynomial_size, + uint32_t base_log, + uint32_t l_gadget, + uint32_t input_lwe_ciphertext_count, + uint32_t num_lut_vectors, + uint32_t lwe_idx, + uint32_t max_shared_memory) { + + int SM_FULL = sizeof(Torus) * polynomial_size + // accumulator mask + sizeof(Torus) * polynomial_size + // accumulator body + sizeof(Torus) * polynomial_size + // accumulator mask rotated + sizeof(Torus) * polynomial_size + // accumulator body rotated + sizeof(int16_t) * polynomial_size + // accumulator_dec mask + sizeof(int16_t) * polynomial_size + // accumulator_dec_body + sizeof(double2) * polynomial_size / 2 + // accumulator fft mask + sizeof(double2) * polynomial_size / 2 + // accumulator fft body + sizeof(double2) * polynomial_size / 2; // calculate buffer fft + + int SM_PART = sizeof(double2) * polynomial_size / 2; // calculate buffer fft + + int DM_PART = SM_FULL - SM_PART; + + int DM_FULL = SM_FULL; + + auto stream = static_cast(v_stream); + + char *d_mem; + + // Create a 1-dimensional grid of threads + // where each block handles 1 sample and each thread + // handles opt polynomial coefficients + // (actually opt/2 coefficients since we compress the real polynomial into a + // complex) + // TODO (Agnes) Polynomial size / params::opt should be equal to 256 or 512 + // probably, maybe 1024 would be too big? + // Or would it actually be good in our case to have the largest possible + // number of threads per block since anyway few blocks will run + // concurrently? + dim3 grid(input_lwe_ciphertext_count, 1, 1); + dim3 thds(polynomial_size / params::opt, 1, 1); + + // Launch the kernel using polynomial_size/opt threads + // where each thread computes opt polynomial coefficients + // Depending on the required amount of shared memory, choose + // from one of three templates (no use, partial use or full use + // of shared memory) + if (max_shared_memory < SM_PART) { + checkCudaErrors(cudaMalloc((void **)&d_mem, DM_FULL * input_lwe_ciphertext_count)); + device_bootstrap_amortized + <<>>( + lwe_out, lut_vector, lut_vector_indexes, lwe_in, + bootstrapping_key, d_mem, + input_lwe_dimension, polynomial_size, + base_log, l_gadget, lwe_idx, DM_FULL); + } else if (max_shared_memory < SM_FULL) { + cudaFuncSetAttribute(device_bootstrap_amortized, + cudaFuncAttributeMaxDynamicSharedMemorySize, + SM_PART); + cudaFuncSetCacheConfig( + device_bootstrap_amortized, + cudaFuncCachePreferShared); + checkCudaErrors(cudaMalloc((void **)&d_mem, DM_PART * input_lwe_ciphertext_count)); + device_bootstrap_amortized + <<>>( + lwe_out, lut_vector, lut_vector_indexes, + lwe_in, bootstrapping_key, + d_mem, input_lwe_dimension, polynomial_size, + base_log, l_gadget, lwe_idx, + DM_PART); + } else { + // For devices with compute capability 7.x a single thread block can + // address the full capacity of shared memory. Shared memory on the + // device then has to be allocated dynamically. + // For lower compute capabilities, this call + // just does nothing and the amount of shared memory used is 48 KB + checkCudaErrors(cudaFuncSetAttribute( + device_bootstrap_amortized, + cudaFuncAttributeMaxDynamicSharedMemorySize, + SM_FULL)); + // TODO (Agnes): is this necessary? + checkCudaErrors(cudaFuncSetCacheConfig( + device_bootstrap_amortized, + cudaFuncCachePreferShared)); + checkCudaErrors(cudaMalloc((void **)&d_mem, 0)); + + device_bootstrap_amortized + <<>>( + lwe_out, lut_vector, lut_vector_indexes, + lwe_in, bootstrapping_key, + d_mem, input_lwe_dimension, polynomial_size, + base_log, l_gadget, lwe_idx, + 0); + } + // Synchronize the streams before copying the result to lwe_out at the right + // place + cudaStreamSynchronize(*stream); + cudaFree(d_mem); + +} + +template +int cuda_get_pbs_per_gpu(int polynomial_size) { + + int blocks_per_sm = 0; + int num_threads = polynomial_size / params::opt; + cudaGetDeviceCount(0); + cudaDeviceProp device_properties; + // FIXME: here we assume every device has same properties + cudaGetDeviceProperties(&device_properties, 0); + cudaOccupancyMaxActiveBlocksPerMultiprocessor( + &blocks_per_sm, device_bootstrap_amortized, + num_threads, 0); + + return device_properties.multiProcessorCount * blocks_per_sm; +} + +#endif // CNCRT_PBS_H diff --git a/src/bootstrap_low_latency.cu b/src/bootstrap_low_latency.cu new file mode 100644 index 000000000..7073def4c --- /dev/null +++ b/src/bootstrap_low_latency.cu @@ -0,0 +1,183 @@ +#include "bootstrap_low_latency.cuh" + +/* Perform bootstrapping on a batch of input LWE ciphertexts + * + * - lwe_out: output batch of num_samples bootstrapped ciphertexts c = + * (a0,..an-1,b) where n is the LWE dimension + * - lut_vector: should hold as many test vectors of size polynomial_size + * as there are input ciphertexts, but actually holds + * num_lut_vectors vectors to reduce memory usage + * - lut_vector_indexes: stores the index corresponding to + * which test vector to use for each sample in + * lut_vector + * - lwe_in: input batch of num_samples LWE ciphertexts, containing n + * mask values + 1 body value + * - bootstrapping_key: RGSW encryption of the LWE secret key sk1 + * under secret key sk2 + * bsk = Z + sk1 H + * where H is the gadget matrix and Z is a matrix (k+1).l + * containing GLWE encryptions of 0 under sk2. + * bsk is thus a tensor of size (k+1)^2.l.N.n + * where l is the number of decomposition levels and + * k is the GLWE dimension, N is the polynomial size for + * GLWE. The polynomial size for GLWE and the test vector + * are the same because they have to be in the same ring + * to be multiplied. + * Note: it is necessary to generate (k+1).k.l.N.n + * uniformly random coefficients for the zero encryptions + * - lwe_dimension: size of the Torus vector used to encrypt the input + * LWE ciphertexts - referred to as n above (~ 600) + * - polynomial_size: size of the test polynomial (test vector) and size of the + * GLWE polynomial (~1024) + * - base_log: log base used for the gadget matrix - B = 2^base_log (~8) + * - l_gadget: number of decomposition levels in the gadget matrix (~4) + * - num_samples: number of encrypted input messages + * - num_lut_vectors: parameter to set the actual number of test vectors to be + * used + * - q: number of bytes in the integer representation (32 or 64) + * + * This function calls a wrapper to a device kernel that performs the + * bootstrapping: + * - the kernel is templatized based on integer discretization and + * polynomial degree + * - num_samples blocks of threads are launched, where each thread is going + * to handle one or more polynomial coefficients at each stage: + * - perform the blind rotation + * - round the result + * - decompose into l_gadget levels, then for each level: + * - switch to the FFT domain + * - multiply with the bootstrapping key + * - come back to the coefficients representation + * - between each stage a synchronization of the threads is necessary TODO + * (Agnes) check this + * - in case the device has enough shared memory, temporary arrays used for + * the different stages (accumulators) are stored into the shared memory + * - the accumulators serve to combine the results for all decomposition + * levels TODO (Agnes) check this + * - the constant memory (64K) is used for storing the roots of identity + * values for the FFT + */ +void cuda_bootstrap_low_latency_lwe_ciphertext_vector_32( + void *v_stream, + void *lwe_out, + void *lut_vector, + void *lut_vector_indexes, + void *lwe_in, + void *bootstrapping_key, + uint32_t lwe_dimension, + uint32_t polynomial_size, + uint32_t base_log, + uint32_t l_gadget, + uint32_t num_samples, + uint32_t num_lut_vectors, + uint32_t lwe_idx, + uint32_t max_shared_memory) { + + switch (polynomial_size) { + case 512: + host_bootstrap_low_latency>( + v_stream, (uint32_t *)lwe_out, (uint32_t *)lut_vector, + (uint32_t *)lut_vector_indexes, (uint32_t *)lwe_in, + (double2 *)bootstrapping_key, lwe_dimension, polynomial_size, + base_log, l_gadget, num_samples, + num_lut_vectors); + break; + case 1024: + host_bootstrap_low_latency>( + v_stream, (uint32_t *)lwe_out, (uint32_t *)lut_vector, + (uint32_t *)lut_vector_indexes, (uint32_t *)lwe_in, + (double2 *)bootstrapping_key, lwe_dimension, polynomial_size, + base_log, l_gadget, num_samples, + num_lut_vectors); + break; + case 2048: + host_bootstrap_low_latency>( + v_stream, (uint32_t *)lwe_out, (uint32_t *)lut_vector, + (uint32_t *)lut_vector_indexes, (uint32_t *)lwe_in, + (double2 *)bootstrapping_key, lwe_dimension, polynomial_size, + base_log, l_gadget, num_samples, + num_lut_vectors); + break; + case 4096: + host_bootstrap_low_latency>( + v_stream, (uint32_t *)lwe_out, (uint32_t *)lut_vector, + (uint32_t *)lut_vector_indexes, (uint32_t *)lwe_in, + (double2 *)bootstrapping_key, lwe_dimension, polynomial_size, + base_log, l_gadget, num_samples, + num_lut_vectors); + break; + case 8192: + host_bootstrap_low_latency>( + v_stream, (uint32_t *)lwe_out, (uint32_t *)lut_vector, + (uint32_t *)lut_vector_indexes, (uint32_t *)lwe_in, + (double2 *)bootstrapping_key, lwe_dimension, polynomial_size, + base_log, l_gadget, num_samples, + num_lut_vectors); + break; + default: + break; + } +} + +void cuda_bootstrap_low_latency_lwe_ciphertext_vector_64( + void *v_stream, + void *lwe_out, + void *lut_vector, + void *lut_vector_indexes, + void *lwe_in, + void *bootstrapping_key, + uint32_t lwe_dimension, + uint32_t polynomial_size, + uint32_t base_log, + uint32_t l_gadget, + uint32_t num_samples, + uint32_t num_lut_vectors, + uint32_t lwe_idx, + uint32_t max_shared_memory) { + + switch (polynomial_size) { + case 512: + host_bootstrap_low_latency>( + v_stream, (uint64_t *)lwe_out, (uint64_t *)lut_vector, + (uint32_t *)lut_vector_indexes, (uint64_t *)lwe_in, + (double2 *)bootstrapping_key, lwe_dimension, polynomial_size, + base_log, l_gadget, num_samples, + num_lut_vectors); + break; + case 1024: + host_bootstrap_low_latency>( + v_stream, (uint64_t *)lwe_out, (uint64_t *)lut_vector, + (uint32_t *)lut_vector_indexes, (uint64_t *)lwe_in, + (double2 *)bootstrapping_key, lwe_dimension, polynomial_size, + base_log, l_gadget, num_samples, + num_lut_vectors); + break; + case 2048: + host_bootstrap_low_latency>( + v_stream, (uint64_t *)lwe_out, (uint64_t *)lut_vector, + (uint32_t *)lut_vector_indexes, (uint64_t *)lwe_in, + (double2 *)bootstrapping_key, lwe_dimension, polynomial_size, + base_log, l_gadget, num_samples, + num_lut_vectors); + break; + case 4096: + host_bootstrap_low_latency>( + v_stream, (uint64_t *)lwe_out, (uint64_t *)lut_vector, + (uint32_t *)lut_vector_indexes, (uint64_t *)lwe_in, + (double2 *)bootstrapping_key, lwe_dimension, polynomial_size, + base_log, l_gadget, num_samples, + num_lut_vectors); + break; + case 8192: + host_bootstrap_low_latency>( + v_stream, (uint64_t *)lwe_out, (uint64_t *)lut_vector, + (uint32_t *)lut_vector_indexes, (uint64_t *)lwe_in, + (double2 *)bootstrapping_key, lwe_dimension, polynomial_size, + base_log, l_gadget, num_samples, + num_lut_vectors); + break; + default: + break; + } +} + diff --git a/src/bootstrap_low_latency.cuh b/src/bootstrap_low_latency.cuh new file mode 100644 index 000000000..5ab608e89 --- /dev/null +++ b/src/bootstrap_low_latency.cuh @@ -0,0 +1,348 @@ +#ifdef __CDT_PARSER__ +#undef __CUDA_RUNTIME_H__ +#include +#include +#endif + +#ifndef LOWLAT_PBS_H +#define LOWLAT_PBS_H + +#include "cooperative_groups.h" + +#include "../include/helper_cuda.h" +#include "bootstrap.h" +#include "complex/operations.cuh" +#include "crypto/gadget.cuh" +#include "crypto/torus.cuh" +#include "fft/bnsmfft.cuh" +#include "fft/smfft.cuh" +#include "fft/twiddles.cuh" +#include "polynomial/parameters.cuh" +#include "polynomial/polynomial.cuh" +#include "polynomial/polynomial_math.cuh" +#include "utils/memory.cuh" +#include "utils/timer.cuh" + +// Cooperative groups are used in the low latency +// version of the bootstrapping +using namespace cooperative_groups; +namespace cg = cooperative_groups; + +template +__device__ void +mul_trgsw_trlwe(Torus *accumulator, + double2 *fft, + int16_t *trlwe_decomposed, + double2 *mask_join_buffer, + double2 *body_join_buffer, + double2 *bootstrapping_key, + int polynomial_size, int l_gadget, int iteration, grid_group &grid) { + + // Put the decomposed TRLWE sample in the Fourier domain + real_to_complex_compressed(trlwe_decomposed, + fft); + synchronize_threads_in_block(); + + // Switch to the FFT space + NSMFFT_direct>(fft); + synchronize_threads_in_block(); + + correction_direct_fft_inplace(fft); + synchronize_threads_in_block(); + + + + // Get the pieces of the bootstrapping key that will be needed for the + // external product; blockIdx.x is the ID of the block that's executing + // this function, so we end up getting the lines of the bootstrapping key + // needed to perform the external product in this block (corresponding to + // the same decomposition level) + +// auto bsk_mask_slice = bootstrapping_key.get_ith_mask_kth_block( +// gpu_num, iteration, blockIdx.y, blockIdx.x); +// auto bsk_body_slice = bootstrapping_key.get_ith_body_kth_block( +// gpu_num, iteration, blockIdx.y, blockIdx.x); + + auto bsk_mask_slice = PolynomialFourier( + get_ith_mask_kth_block( + bootstrapping_key, iteration, blockIdx.y, blockIdx.x, + polynomial_size, 1, l_gadget)); + auto bsk_body_slice = PolynomialFourier( + get_ith_body_kth_block( + bootstrapping_key, iteration, blockIdx.y, blockIdx.x, + polynomial_size, 1, l_gadget)); + + // Perform the matrix multiplication between the RGSW and the TRLWE, + // each block operating on a single level for mask and body + + auto first_processed_bsk = (blockIdx.y == 0) ? bsk_mask_slice : bsk_body_slice; + auto second_processed_bsk = (blockIdx.y == 0) ? bsk_body_slice : bsk_mask_slice; + + auto first_processed_acc = (blockIdx.y == 0) ? + &mask_join_buffer[params::degree / 2 * blockIdx.x] : + &body_join_buffer[params::degree / 2 * blockIdx.x]; + auto second_processed_acc = (blockIdx.y == 0) ? + &body_join_buffer[params::degree / 2 * blockIdx.x] : + &mask_join_buffer[params::degree / 2 * blockIdx.x]; + + int tid = threadIdx.x; + + //first product + for(int i = 0; i < params::opt / 2; i++) { + first_processed_acc[tid] = fft[tid] * first_processed_bsk.m_values[tid]; + tid += params::degree / params::opt; + } + + grid.sync(); + tid = threadIdx.x; + //second product + for(int i = 0; i < params::opt / 2; i++) { + second_processed_acc[tid] += fft[tid] * second_processed_bsk.m_values[tid]; + tid += params::degree / params::opt; + } + + + // ----------------------------------------------------------------- + + // All blocks are synchronized here; after this sync, *_join_buffer has the + // values needed from every other block + grid.sync(); + + auto src_acc = (blockIdx.y == 0) ? mask_join_buffer : body_join_buffer; + + // copy first product into fft buffer + tid = threadIdx.x; + for (int i = 0; i < params::opt / 2; i++) { + fft[tid] = src_acc[tid]; + tid += params::degree / params::opt; + } + synchronize_threads_in_block(); + + // accumulate rest of the products into fft buffer + for (int l = 1; l < gridDim.x; l++) { + auto cur_src_acc = &src_acc[l * params::degree / 2]; + tid = threadIdx.x; + for (int i = 0; i < params::opt / 2; i++) { + fft[tid] += cur_src_acc[tid]; + tid += params::degree / params::opt; + } + } + + synchronize_threads_in_block(); + + correction_inverse_fft_inplace(fft); + synchronize_threads_in_block(); + + // Perform the inverse FFT on the result of the RGSWxTRLWE and add to the + // accumulator + NSMFFT_inverse>(fft); + synchronize_threads_in_block(); + + add_to_torus(fft, accumulator); + + __syncthreads(); +} + +template +/* + * Kernel launched by the low latency version of the + * bootstrapping, that uses cooperative groups + * lwe_out vector of output lwe s, with length (polynomial_size+1)*num_samples + * lut_vector - vector of look up tables with length polynomial_size * num_samples + * lut_vector_indexes - mapping between lwe_in and lut_vector + * lwe_in - vector of lwe inputs with length (lwe_mask_size + 1) * num_samples + * + */ +__global__ void device_bootstrap_low_latency( + Torus *lwe_out, + Torus *lut_vector, + Torus *lwe_in, + double2 *bootstrapping_key, + double2 *mask_join_buffer, + double2 *body_join_buffer, + uint32_t lwe_mask_size, + uint32_t polynomial_size, uint32_t base_log, uint32_t l_gadget + ) { + + grid_group grid = this_grid(); + + // We use shared memory for the polynomials that are used often during the + // bootstrap, since shared memory is kept in L1 cache and accessing it is + // much faster than global memory + extern __shared__ char sharedmem[]; + + char* selected_memory = sharedmem; + + int16_t *accumulator_decomposed = (int16_t *)selected_memory; + Torus *accumulator = (Torus*)accumulator_decomposed + + polynomial_size / (sizeof(Torus) / sizeof(int16_t)); + double2 *accumulator_fft = (double2*)accumulator + + polynomial_size / (sizeof(double2) / sizeof(Torus)); + + // Reuse memory from accumulator_fft for accumulator_rotated + Torus* accumulator_rotated = (Torus*)accumulator_fft; + + // The third dimension of the block is used to determine on which ciphertext + // this block is operating, in the case of batch bootstraps + auto block_lwe_in = &lwe_in[blockIdx.z * (lwe_mask_size + 1)]; + + auto block_lut_vector = + &lut_vector[blockIdx.z * params::degree * 2]; + + auto block_mask_join_buffer = &mask_join_buffer[blockIdx.z * l_gadget * params::degree / 2]; + auto block_body_join_buffer = &body_join_buffer[blockIdx.z * l_gadget * params::degree / 2]; + + // Since the space is L1 cache is small, we use the same memory location for + // the rotated accumulator and the fft accumulator, since we know that the + // rotated array is not in use anymore by the time we perform the fft + + GadgetMatrix gadget(base_log, l_gadget); + + // Put "b" in [0, 2N[ + Torus b_hat = rescale_torus_element( + block_lwe_in[lwe_mask_size], + 2 * params::degree); + + if (blockIdx.y == 0) { + divide_by_monomial_negacyclic_inplace( + accumulator, block_lut_vector, b_hat, false); + } + else { + divide_by_monomial_negacyclic_inplace( + accumulator, &block_lut_vector[params::degree], b_hat, false); + } + + for (int i = 0; i < lwe_mask_size; i++) { + synchronize_threads_in_block(); + + // Put "a" in [0, 2N[ + Torus a_hat = rescale_torus_element( + block_lwe_in[i], + 2 * params::degree); // 2 * params::log2_degree + 1); + + if (a_hat == 0) { + // todo(Joao): **cannot use this optimization** + // the reason is that one of the input ciphertexts (blockIdx.z) + // might skip an iteration while others don't, which as a result + // will make that block not call the grid.sync(), causing a deadlock; + // maybe it's a workaround to add grid.sync() here, but not sure if + // there are any edge cases? + + // continue + } + + // Perform ACC * (X^ä - 1) + multiply_by_monomial_negacyclic_and_sub_polynomial< + Torus, params::opt, params::degree / params::opt>( + accumulator, accumulator_rotated, a_hat); + + + // Perform a rounding to increase the accuracy of the + // bootstrapped ciphertext + round_to_closest_multiple_inplace( + accumulator_rotated, base_log, l_gadget); + + + + // Decompose the accumulator. Each block gets one level of the + // decomposition, for the mask and the body (so block 0 will have the + // accumulator decomposed at level 0, 1 at 1, etc.) + gadget.decompose_one_level(accumulator_decomposed, accumulator_rotated, + blockIdx.x); + + // We are using the same memory space for accumulator_fft and + // accumulator_rotated, so we need to synchronize here to make sure they + // don't modify the same memory space at the same time + synchronize_threads_in_block(); + // Perform G^-1(ACC) * RGSW -> TRLWE + mul_trgsw_trlwe( + accumulator, + accumulator_fft, + accumulator_decomposed, + block_mask_join_buffer, + block_body_join_buffer, + bootstrapping_key, + polynomial_size, l_gadget, i, grid); + } + + auto block_lwe_out = &lwe_out[blockIdx.z * (polynomial_size + 1)]; + + if (blockIdx.x == 0 && blockIdx.y == 0) { + // Perform a sample extract. At this point, all blocks have the result, but + // we do the computation at block 0 to avoid waiting for extra blocks, in + // case they're not synchronized + sample_extract_mask(block_lwe_out, accumulator); + } else if (blockIdx.x == 0 && blockIdx.y == 1) { + sample_extract_body(block_lwe_out, accumulator); + } + +} + + +/* + * Host wrapper to the low latency version + * of bootstrapping + */ +template +__host__ void host_bootstrap_low_latency( + void *v_stream, + Torus *lwe_out, + Torus *lut_vector, + uint32_t *lut_vector_indexes, + Torus *lwe_in, + double2 *bootstrapping_key, + uint32_t lwe_mask_size, + uint32_t polynomial_size, + uint32_t base_log, + uint32_t l_gadget, + uint32_t num_samples, + uint32_t num_lut_vectors) { + auto stream = static_cast(v_stream); + + int buffer_size_per_gpu = l_gadget * num_samples * polynomial_size / 2 * sizeof(double2); + double2 *mask_buffer_fft; + double2 *body_buffer_fft; + checkCudaErrors(cudaMalloc((void **)&mask_buffer_fft, buffer_size_per_gpu)); + checkCudaErrors(cudaMalloc((void **)&body_buffer_fft, buffer_size_per_gpu)); + + + int bytes_needed = + sizeof(int16_t) * polynomial_size + // accumulator_decomp + sizeof(Torus) * polynomial_size + // accumulator + sizeof(double2) * polynomial_size / 2; // accumulator fft + + int thds = polynomial_size / params::opt; + dim3 grid(l_gadget, 2, num_samples); + + void *kernel_args[10]; + kernel_args[0] = &lwe_out; + kernel_args[1] = &lut_vector; + kernel_args[2] = &lwe_in; + kernel_args[3] = &bootstrapping_key; + kernel_args[4] = &mask_buffer_fft; + kernel_args[5] = &body_buffer_fft; + kernel_args[6] = &lwe_mask_size; + kernel_args[7] = &polynomial_size; + kernel_args[8] = &base_log; + kernel_args[9] =&l_gadget; + + checkCudaErrors(cudaFuncSetAttribute(device_bootstrap_low_latency, + cudaFuncAttributeMaxDynamicSharedMemorySize, + bytes_needed)); + cudaFuncSetCacheConfig(device_bootstrap_low_latency, + cudaFuncCachePreferShared); + + checkCudaErrors(cudaLaunchCooperativeKernel ( (void *)device_bootstrap_low_latency, grid, thds, (void**)kernel_args, bytes_needed, *stream )) ; + + // Synchronize the streams before copying the result to lwe_out at the right + // place + cudaStreamSynchronize(*stream); + cudaFree(mask_buffer_fft); + cudaFree(body_buffer_fft); +} + +#endif // LOWLAT_PBS_H diff --git a/src/complex/operations.cuh b/src/complex/operations.cuh new file mode 100644 index 000000000..47a2665f7 --- /dev/null +++ b/src/complex/operations.cuh @@ -0,0 +1,87 @@ +#ifndef GPU_BOOTSTRAP_COMMON_CUH +#define GPU_BOOTSTRAP_COMMON_CUH + +#include +#include +#include + +#define SNT 1 +#define dPI 6.283185307179586231995926937088 + +using sTorus = int32_t; +// using Torus = uint32_t; +using sTorus = int32_t; +using u32 = uint32_t; +using i32 = int32_t; + +//-------------------------------------------------- +// Basic double2 operations + +__device__ inline double2 conjugate(const double2 num) { + double2 res; + res.x = num.x; + res.y = -num.y; + return res; +} + +__device__ inline void operator+=(double2 &lh, const double2 rh) { + lh.x += rh.x; + lh.y += rh.y; +} + +__device__ inline void operator-=(double2 &lh, const double2 rh) { + lh.x -= rh.x; + lh.y -= rh.y; +} + +__device__ inline double2 operator+(const double2 a, const double2 b) { + double2 res; + res.x = a.x + b.x; + res.y = a.y + b.y; + return res; +} + +__device__ inline double2 operator-(const double2 a, const double2 b) { + double2 res; + res.x = a.x - b.x; + res.y = a.y - b.y; + return res; +} + +__device__ inline double2 operator*(const double2 a, const double2 b) { + double xx = a.x * b.x; + double xy = a.x * b.y; + double yx = a.y * b.x; + double yy = a.y * b.y; + + double2 res; + // asm volatile("fma.rn.f64 %0, %1, %2, %3;": "=d"(res.x) : "d"(a.x), + // "d"(b.x), "d"(yy)); + res.x = xx - yy; + res.y = xy + yx; + return res; +} + +__device__ inline double2 operator*(const double2 a, double b) { + double2 res; + res.x = a.x * b; + res.y = a.y * b; + return res; +} + +__device__ inline void operator*=(double2 &a, const double2 b) { + double tmp = a.x; + a.x *= b.x; + a.x -= a.y * b.y; + a.y *= b.x; + a.y += b.y * tmp; +} + +__device__ inline double2 operator*(double a, double2 b) { + double2 res; + res.x = b.x * a; + res.y = b.y * a; + return res; +} + +#endif \ No newline at end of file diff --git a/src/crypto/bootstrapping_key.cuh b/src/crypto/bootstrapping_key.cuh new file mode 100644 index 000000000..2d881dc4e --- /dev/null +++ b/src/crypto/bootstrapping_key.cuh @@ -0,0 +1,157 @@ +#ifndef CNCRT_BSK_H +#define CNCRT_BSK_H + +#include "bootstrap.h" +#include "polynomial/parameters.cuh" +#include "polynomial/polynomial.cuh" +#include +#include + +__device__ inline int get_start_ith_ggsw(int i, uint32_t polynomial_size, + int glwe_dimension, + uint32_t l_gadget) { + return i * polynomial_size / 2 * (glwe_dimension + 1) * (glwe_dimension + 1) * l_gadget; +} + +__device__ double2* +get_ith_mask_kth_block(double2* ptr, int i, int k, int level, uint32_t polynomial_size, + int glwe_dimension, uint32_t l_gadget) { + return &ptr[get_start_ith_ggsw(i, polynomial_size, glwe_dimension, l_gadget) + + level * polynomial_size / 2 * (glwe_dimension + 1) * (glwe_dimension + 1) + + k * polynomial_size / 2 * (glwe_dimension + 1)]; +} + +__device__ double2* +get_ith_body_kth_block(double2 *ptr, int i, int k, int level, uint32_t polynomial_size, + int glwe_dimension, uint32_t l_gadget) { + return &ptr[get_start_ith_ggsw(i, polynomial_size, glwe_dimension, l_gadget) + + level * polynomial_size / 2 * (glwe_dimension + 1) * (glwe_dimension + 1) + + k * polynomial_size / 2 * (glwe_dimension + 1) + + polynomial_size / 2]; +} + +void cuda_initialize_twiddles(uint32_t polynomial_size, uint32_t gpu_index) { + cudaSetDevice(gpu_index); + int sw_size = polynomial_size / 2; + short *sw1_h, *sw2_h; + + sw1_h = (short *)malloc(sizeof(short) * sw_size); + sw2_h = (short *)malloc(sizeof(short) * sw_size); + + memset(sw1_h, 0, sw_size * sizeof(short)); + memset(sw2_h, 0, sw_size * sizeof(short)); + int cnt = 0; + for (int i = 1, j = 0; i < polynomial_size / 2; i++) { + int bit = (polynomial_size / 2) >> 1; + for (; j & bit; bit >>= 1) + j ^= bit; + j ^= bit; + + if (i < j) { + sw1_h[cnt] = i; + sw2_h[cnt] = j; + cnt++; + } + } + cudaMemcpyToSymbol(SW1, sw1_h, sw_size * sizeof(short), 0, + cudaMemcpyHostToDevice); + cudaMemcpyToSymbol(SW2, sw2_h, sw_size * sizeof(short), 0, + cudaMemcpyHostToDevice); + free(sw1_h); + free(sw2_h); +} + +template +void cuda_convert_lwe_bootstrap_key(double2 *dest, ST *src, void *v_stream, + uint32_t gpu_index, uint32_t input_lwe_dim, uint32_t glwe_dim, + uint32_t l_gadget, uint32_t polynomial_size) { + + cudaSetDevice(gpu_index); + int shared_memory_size = sizeof(double) * polynomial_size; + + int total_polynomials = + input_lwe_dim * (glwe_dim + 1) * (glwe_dim + 1) * + l_gadget; + + // Here the buffer size is the size of double2 times the number of polynomials + // times the polynomial size over 2 because the polynomials are compressed + // into the complex domain to perform the FFT + size_t buffer_size = total_polynomials * polynomial_size / 2 * sizeof + (double2); + + int gridSize = total_polynomials; + int blockSize = polynomial_size / choose_opt(polynomial_size); + // todo(Joao): let's use cudaMallocHost here, + // since it allocates page-staged memory which allows + // faster data copy + double2 *h_bsk = (double2 *)malloc(buffer_size); + double2 *d_bsk; + cudaMalloc((void **)&d_bsk, buffer_size); + + // compress real bsk to complex and divide it on DOUBLE_MAX + for (int i = 0; i < total_polynomials; i++) { + int complex_current_poly_idx = i * polynomial_size / 2; + int torus_current_poly_idx = i * polynomial_size; + for (int j = 0; j < polynomial_size / 2; j++) { + h_bsk[complex_current_poly_idx + j].x = + src[torus_current_poly_idx + 2 * j]; + h_bsk[complex_current_poly_idx + j].y = + src[torus_current_poly_idx + 2 * j + 1]; + h_bsk[complex_current_poly_idx + j].x /= + (double)std::numeric_limits::max(); + h_bsk[complex_current_poly_idx + j].y /= + (double)std::numeric_limits::max(); + } + } + + cudaMemcpy(d_bsk, h_bsk, buffer_size, cudaMemcpyHostToDevice); + + auto stream = static_cast(v_stream); + switch (polynomial_size) { + // FIXME (Agnes): check if polynomial sizes are ok + case 512: + batch_NSMFFT, ForwardFFT>> + <<>>(d_bsk, dest); + break; + case 1024: + batch_NSMFFT, ForwardFFT>> + <<>>(d_bsk, dest); + break; + case 2048: + batch_NSMFFT, ForwardFFT>> + <<>>(d_bsk, dest); + break; + case 4096: + batch_NSMFFT, ForwardFFT>> + <<>>(d_bsk, dest); + break; + case 8192: + batch_NSMFFT, ForwardFFT>> + <<>>(d_bsk, dest); + break; + default: + break; + } + + cudaFree(d_bsk); + free(h_bsk); + +} + +void cuda_convert_lwe_bootstrap_key_32(void *dest, void *src, void *v_stream, + uint32_t gpu_index, uint32_t input_lwe_dim, uint32_t glwe_dim, + uint32_t l_gadget, uint32_t polynomial_size) { + cuda_convert_lwe_bootstrap_key((double2 *)dest, (int32_t *)src, + v_stream, gpu_index, input_lwe_dim, + glwe_dim, l_gadget, polynomial_size); +} + +void cuda_convert_lwe_bootstrap_key_64(void *dest, void *src, void *v_stream, + uint32_t gpu_index, uint32_t input_lwe_dim, uint32_t glwe_dim, + uint32_t l_gadget, uint32_t polynomial_size) { + cuda_convert_lwe_bootstrap_key((double2 *)dest, (int64_t *)src, + v_stream, gpu_index, input_lwe_dim, + glwe_dim, l_gadget, polynomial_size); +} + +#endif // CNCRT_BSK_H diff --git a/src/crypto/gadget.cuh b/src/crypto/gadget.cuh new file mode 100644 index 000000000..497fd4300 --- /dev/null +++ b/src/crypto/gadget.cuh @@ -0,0 +1,91 @@ +#ifndef CNCRT_CRYPTO_H +#define CNCRT_CRPYTO_H + +#include "polynomial/polynomial.cuh" +#include + +template class GadgetMatrix { +private: + uint32_t l_gadget; + uint32_t base_log; + uint32_t mask; + uint32_t halfbg; + T offset; + +public: + __device__ GadgetMatrix(uint32_t base_log, uint32_t l_gadget) + : base_log(base_log), l_gadget(l_gadget) { + uint32_t bg = 1 << base_log; + this->halfbg = bg / 2; + this->mask = bg - 1; + T temp = 0; + for (int i = 0; i < this->l_gadget; i++) { + temp += 1ULL << (sizeof(T) * 8 - (i + 1) * this->base_log); + } + this->offset = temp * this->halfbg; + } + + template + __device__ void decompose_one_level(Polynomial &result, + Polynomial &polynomial, + uint32_t level) { + int tid = threadIdx.x; + for (int i = 0; i < params::opt; i++) { + T s = polynomial.coefficients[tid] + this->offset; + uint32_t decal = (sizeof(T) * 8 - (level + 1) * this->base_log); + T temp1 = (s >> decal) & this->mask; + result.coefficients[tid] = (V)(temp1 - this->halfbg); + tid += params::degree / params::opt; + } + } + template + __device__ void decompose_one_level(V *result, U *polynomial, + uint32_t level) { + int tid = threadIdx.x; + for (int i = 0; i < params::opt; i++) { + T s = polynomial[tid] + this->offset; + uint32_t decal = (sizeof(T) * 8 - (level + 1) * this->base_log); + T temp1 = (s >> decal) & this->mask; + result[tid] = (V)(temp1 - this->halfbg); + tid += params::degree / params::opt; + } + } + + __device__ T decompose_one_level_single(T element, uint32_t level) { + T s = element + this->offset; + uint32_t decal = (sizeof(T) * 8 - (level + 1) * this->base_log); + T temp1 = (s >> decal) & this->mask; + return (T)(temp1 - this->halfbg); + } +}; + +template class GadgetMatrixSingle { +private: + uint32_t l_gadget; + uint32_t base_log; + uint32_t mask; + uint32_t halfbg; + T offset; + +public: + __device__ GadgetMatrixSingle(uint32_t base_log, uint32_t l_gadget) + : base_log(base_log), l_gadget(l_gadget) { + uint32_t bg = 1 << base_log; + this->halfbg = bg / 2; + this->mask = bg - 1; + T temp = 0; + for (int i = 0; i < this->l_gadget; i++) { + temp += 1ULL << (sizeof(T) * 8 - (i + 1) * this->base_log); + } + this->offset = temp * this->halfbg; + } + + __device__ T decompose_one_level_single(T element, uint32_t level) { + T s = element + this->offset; + uint32_t decal = (sizeof(T) * 8 - (level + 1) * this->base_log); + T temp1 = (s >> decal) & this->mask; + return (T)(temp1 - this->halfbg); + } +}; + +#endif // CNCRT_CRPYTO_H diff --git a/src/crypto/torus.cuh b/src/crypto/torus.cuh new file mode 100644 index 000000000..9dca4cb73 --- /dev/null +++ b/src/crypto/torus.cuh @@ -0,0 +1,45 @@ +#ifndef CNCRT_TORUS_H +#define CNCRT_TORUS_H + +#include "types/int128.cuh" +#include + +template +__device__ inline Torus typecast_double_to_torus(double x) { + if constexpr (sizeof(Torus) < 8) { + // this simple cast works up to 32 bits, afterwards we must do it manually + long long ret = x; + return (Torus)ret; + } else { + int128 nnnn = make_int128_from_float(x); + uint64_t lll = nnnn.lo_; + return lll; + } + // nvcc doesn't get it that the if {} else {} above should always return + // something, and complains that this function might return nothing, so we + // put this useless return here + return 0; +} + +template +__device__ inline T round_to_closest_multiple(T x, uint32_t base_log, + uint32_t l_gadget) { + T shift = sizeof(T) * 8 - l_gadget * base_log; + T mask = 1ll << (shift - 1); + T b = (x & mask) >> (shift - 1); + T res = x >> shift; + res += b; + res <<= shift; + return res; +} + +template +__device__ __forceinline__ T rescale_torus_element(T element, + uint32_t log_shift) { + // todo(Joao): not sure if this works + // return element >> log_shift; + return round((double)element / (double(std::numeric_limits::max()) + 1.0) * + (double)log_shift); +} + +#endif // CNCRT_TORUS_H \ No newline at end of file diff --git a/src/device.cu b/src/device.cu new file mode 100644 index 000000000..fdc3a1f54 --- /dev/null +++ b/src/device.cu @@ -0,0 +1,147 @@ +#include "device.h" +#include +#include +#include +#include + +/// Unsafe function to create a CUDA stream, must check first that GPU exists +void *cuda_create_stream(uint32_t gpu_index) { + cudaSetDevice(gpu_index); + cudaStream_t *stream = new cudaStream_t; + cudaStreamCreate(stream); + return stream; +} + +/// Unsafe function to destroy CUDA stream, must check first the GPU exists +int cuda_destroy_stream(void *v_stream, uint32_t gpu_index) { + cudaSetDevice(gpu_index); + auto stream = static_cast(v_stream); + cudaStreamDestroy(*stream); + return 0; +} + +/// Unsafe function that will try to allocate even if gpu_index is invalid +/// or if there's not enough memory. A safe wrapper around it must call +/// cuda_check_valid_malloc() first +void *cuda_malloc(uint64_t size, uint32_t gpu_index) { + cudaSetDevice(gpu_index); + void *ptr; + checkCudaErrors(cudaMalloc((void **)&ptr, size)); + + return ptr; +} + +/// Checks that allocation is valid +/// 0: valid +/// -1: invalid, not enough memory in device +/// -2: invalid, gpu index doesn't exist +int cuda_check_valid_malloc(uint64_t size, uint32_t gpu_index) { + + if (gpu_index >= cuda_get_number_of_gpus()) { + // error code: invalid gpu_index + return -2; + } + cudaSetDevice(gpu_index); + size_t total_mem, free_mem; + cudaMemGetInfo(&free_mem, &total_mem); + if (size > free_mem) { + // error code: not enough memory + return -1; + } + return 0; +} + +/// Tries to copy memory to the GPU asynchronously +/// 0: success +/// -1: error, invalid device pointer +/// -2: error, gpu index doesn't exist +int cuda_memcpy_async_to_gpu(void *dest, void *src, uint64_t size, + void *v_stream, uint32_t gpu_index) { + if (gpu_index >= cuda_get_number_of_gpus()) { + // error code: invalid gpu_index + return -2; + } + cudaPointerAttributes attr; + cudaPointerGetAttributes(&attr, dest); + if (attr.device != gpu_index && attr.type != cudaMemoryTypeDevice) { + // error code: invalid device pointer + return -1; + } + auto stream = static_cast(v_stream); + cudaSetDevice(gpu_index); + checkCudaErrors(cudaMemcpyAsync(dest, src, size, cudaMemcpyHostToDevice, + *stream)); + return 0; +} + +/// Synchronizes device +/// 0: success +/// -2: error, gpu index doesn't exist +int cuda_synchronize_device(uint32_t gpu_index) { + if (gpu_index >= cuda_get_number_of_gpus()) { + // error code: invalid gpu_index + return -2; + } + cudaSetDevice(gpu_index); + cudaDeviceSynchronize(); + return 0; +} + +/// Tries to copy memory to the GPU asynchronously +/// 0: success +/// -1: error, invalid device pointer +/// -2: error, gpu index doesn't exist +int cuda_memcpy_async_to_cpu(void *dest, const void *src, uint64_t size, + void *v_stream, uint32_t gpu_index) { + if (gpu_index >= cuda_get_number_of_gpus()) { + // error code: invalid gpu_index + return -2; + } + cudaPointerAttributes attr; + cudaPointerGetAttributes(&attr, src); + if (attr.device != gpu_index && attr.type != cudaMemoryTypeDevice) { + // error code: invalid device pointer + return -1; + } + auto stream = static_cast(v_stream); + cudaSetDevice(gpu_index); + checkCudaErrors(cudaMemcpyAsync(dest, src, size, cudaMemcpyDeviceToHost, + *stream)); + return 0; +} + +/// Return number of GPUs available +int cuda_get_number_of_gpus() { + int num_gpus; + cudaGetDeviceCount(&num_gpus); + return num_gpus; +} + +/// Drop a cuda array +int cuda_drop(void *ptr, uint32_t gpu_index) { + if (gpu_index >= cuda_get_number_of_gpus()) { + // error code: invalid gpu_index + return -2; + } + cudaSetDevice(gpu_index); + checkCudaErrors(cudaFree(ptr)); + return 0; +} + +/// Get the maximum size for the shared memory +int cuda_get_max_shared_memory(uint32_t gpu_index) { + if (gpu_index >= cuda_get_number_of_gpus()) { + // error code: invalid gpu_index + return -2; + } + cudaSetDevice(gpu_index); + cudaDeviceProp prop; + cudaGetDeviceProperties(&prop, gpu_index); + int max_shared_memory = 0; + if (prop.major > 7) { + max_shared_memory = prop.sharedMemPerMultiprocessor; + } else { + max_shared_memory = prop.sharedMemPerBlock; + } + return max_shared_memory; +} diff --git a/src/fft/bnsmfft.cuh b/src/fft/bnsmfft.cuh new file mode 100644 index 000000000..f3117bda8 --- /dev/null +++ b/src/fft/bnsmfft.cuh @@ -0,0 +1,753 @@ +#ifndef GPU_BOOTSTRAP_FFT_1024_CUH +#define GPU_BOOTSTRAP_FFT_1024_CUH + +#include "complex/operations.cuh" +#include "polynomial/functions.cuh" +#include "polynomial/parameters.cuh" +#include "twiddles.cuh" + +/* + * bit reverse + * coefficient bits are reversed based on precalculated indexes + * SW1 and SW2 + */ +template __device__ void bit_reverse_inplace(double2 *A) { + int tid = threadIdx.x; +#pragma unroll + for (int i = 0; i < params::opt / 2; i++) { + short sw1 = SW1[tid]; + short sw2 = SW2[tid]; + double2 tmp = A[sw1]; + A[sw1] = A[sw2]; + A[sw2] = tmp; + tid += params::degree / params::opt; + } +} + +/* + * negacyclic twiddle + * returns negacyclic twiddle based on degree and index + * twiddles are precalculated inside negTwids{3..13} arrays + */ +template __device__ double2 negacyclic_twiddle(int j) { + double2 twid; + switch (degree) { + case 512: + twid = negTwids9[j]; + break; + case 1024: + twid = negTwids10[j]; + break; + case 2048: + twid = negTwids11[j]; + break; + case 4096: + twid = negTwids12[j]; + break; + case 8192: + twid = negTwids13[j]; + default: + twid.x = 0; + twid.y = 0; + break; + } + return twid; +} + +/* + * Direct negacyclic FFT: + * - before the FFT the N real coefficients are stored into a + * N/2 sized complex with the even coefficients in the real part + * and the odd coefficients in the imaginary part. This is referred to + * as the half-size FFT + * - when calling BNSMFFT_direct for the forward negacyclic FFT of PBS, + * opt is divided by 2 because the butterfly pattern is always applied + * between pairs of coefficients + * - instead of twisting each coefficient A_j before the FFT by + * multiplying by the w^j roots of unity (aka twiddles, w=exp(-i pi /N)), + * the FFT is modified, and for each level k of the FFT the twiddle: + * w_j,k = exp(-i pi j/2^k) + * is replaced with: + * \zeta_j,k = exp(-i pi (2j-1)/2^k) + * - this technique also implies a correction of the + * complex obtained after the FFT, which is done in the + * forward_negacyclic_fft_inplace function of bootstrap.cuh + */ +template __device__ void NSMFFT_direct(double2 *A) { + /* First, reverse the bits of the input complex + * The bit reversal for half-size FFT has been stored into the + * SW1 and SW2 arrays beforehand + * Each thread is always in charge of "opt/2" pairs of coefficients, + * which is why we always loop through N/2 by N/opt strides + * The pragma unroll instruction tells the compiler to unroll the + * full loop, which should increase performance TODO (Agnes) check this + */ + bit_reverse_inplace(A); + __syncthreads(); + + // Now we go through all the levels of the FFT one by one + // (instead of recursively) + // first iteration: k=1, zeta=i for all coefficients + int tid = threadIdx.x; + int i1, i2; + double2 u, v; +#pragma unroll + for (int i = 0; i < params::opt / 2; i++) { + // the butterfly pattern is applied to each pair + // of coefficients, with a stride of 2 + i1 = tid << 1; + i2 = i1 + 1; + u = A[i1]; + // v = i*A[i2] + v.y = A[i2].x; + v.x = -A[i2].y; + // A[i1] <- A[i1] + i*A[i2] + // A[i2] <- A[i1] - i*A[i2] + A[i1] += v; + A[i2] = u - v; + tid += params::degree / params::opt; + } + __syncthreads(); + + // second iteration: apply the butterfly pattern + // between groups of 4 coefficients + // k=2, \zeta=exp(i pi/4) for even coefficients and + // exp(3 i pi / 4) for odd coefficients + // TODO (Agnes) how does this work on the gpu? aren't we doing + // a lot more computations than we should? + tid = threadIdx.x; + // odd = 0 for even coefficients, 1 for odd coefficients + int odd = tid & 1; +#pragma unroll + for (int i = 0; i < params::opt / 2; i++) { + // the butterfly pattern is applied to each pair + // of coefficients, with a stride of 2 + // i1=2*tid if tid is even and 2*tid-1 if it is odd + i1 = (tid << 1) - odd; + i2 = i1 + 2; + + double a = A[i2].x; + double b = A[i2].y; + u = A[i1]; + + // \zeta_j,2 = exp(-i pi (2j-1)/4) -> j=0: exp(i pi/4) or j=1: exp(-i pi/4) + // \zeta_even = sqrt(2)/2 + i * sqrt(2)/2 = sqrt(2)/2*(1+i) + // \zeta_odd = sqrt(2)/2 - i * sqrt(2)/2 = sqrt(2)/2*(1-i) + + // v_j = \zeta_j * (a+i*b) + // v_even = sqrt(2)/2*((a-b)+i*(a+b)) + // v_odd = sqrt(2)/2*(a+b+i*(b-a)) + v.x = + (odd) ? (-0.707106781186548) * (a + b) : (0.707106781186548) * (a - b); + v.y = (odd) ? (0.707106781186548) * (a - b) : (0.707106781186548) * (a + b); + + // v.x = (0.707106781186548 * odd) * (a + b) + (0.707106781186548 * (!odd)) + // * (a - b); v.y = (0.707106781186548 * odd) * (b - a) + (0.707106781186548 + // * (!odd)) * (a + b); + + A[i1] = u + v; + A[i2] = u - v; + tid += params::degree / params::opt; + } + __syncthreads(); + + // third iteration + // from k=3 on, we have to do the full complex multiplication + tid = threadIdx.x; +#pragma unroll + for (int i = 0; i < params::opt / 2; i++) { + // the butterfly pattern is applied to each pair + // of coefficients, with a stride of 4 + // rem is the remainder of tid/4. tid takes values: + // 0, 1, 2, 3, 4, 5, 6, 7, ... N/4 + // then rem takes values: + // 0, 1, 2, 3, 0, 1, 2, 3, ... N/4 + // and striding by 4 will allow us to cover all + // the coefficients correctly + int rem = tid & 3; + i1 = (tid << 1) - rem; + i2 = i1 + 4; + + double2 w = negTwids3[rem]; + u = A[i1], v = A[i2] * w; + + A[i1] = u + v; + A[i2] = u - v; + tid += params::degree / params::opt; + } + __syncthreads(); + + // 4_th iteration + tid = threadIdx.x; +#pragma unroll + for (int i = 0; i < params::opt / 2; i++) { + // the butterfly pattern is applied to each pair + // of coefficients, with a stride of 8 + // rem is the remainder of tid/8. tid takes values: + // 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ... N/4 + // then rem takes values: + // 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, ... N/4 + // and striding by 8 will allow us to cover all + // the coefficients correctly + int rem = tid & 7; + i1 = (tid << 1) - rem; + i2 = i1 + 8; + + double2 w = negTwids4[rem]; + u = A[i1], v = A[i2] * w; + A[i1] = u + v; + A[i2] = u - v; + tid += params::degree / params::opt; + } + __syncthreads(); + + // 5_th iteration + tid = threadIdx.x; +#pragma unroll + for (int i = 0; i < params::opt / 2; i++) { + // the butterfly pattern is applied to each pair + // of coefficients, with a stride of 16 + // rem is the remainder of tid/16 + // and the same logic as for previous iterations applies + int rem = tid & 15; + i1 = (tid << 1) - rem; + i2 = i1 + 16; + double2 w = negTwids5[rem]; + u = A[i1], v = A[i2] * w; + A[i1] = u + v; + A[i2] = u - v; + tid += params::degree / params::opt; + } + __syncthreads(); + + // 6_th iteration + tid = threadIdx.x; +#pragma unroll + for (int i = 0; i < params::opt / 2; i++) { + // the butterfly pattern is applied to each pair + // of coefficients, with a stride of 32 + // rem is the remainder of tid/32 + // and the same logic as for previous iterations applies + int rem = tid & 31; + i1 = (tid << 1) - rem; + i2 = i1 + 32; + double2 w = negTwids6[rem]; + u = A[i1], v = A[i2] * w; + A[i1] = u + v; + A[i2] = u - v; + tid += params::degree / params::opt; + } + __syncthreads(); + + // 7_th iteration + tid = threadIdx.x; +#pragma unroll + for (int i = 0; i < params::opt / 2; i++) { + // the butterfly pattern is applied to each pair + // of coefficients, with a stride of 64 + // rem is the remainder of tid/64 + // and the same logic as for previous iterations applies + int rem = tid & 63; + i1 = (tid << 1) - rem; + i2 = i1 + 64; + double2 w = negTwids7[rem]; + u = A[i1], v = A[i2] * w; + A[i1] = u + v; + A[i2] = u - v; + tid += params::degree / params::opt; + } + __syncthreads(); + + // 8_th iteration + tid = threadIdx.x; +#pragma unroll + for (int i = 0; i < params::opt / 2; i++) { + // the butterfly pattern is applied to each pair + // of coefficients, with a stride of 128 + // rem is the remainder of tid/128 + // and the same logic as for previous iterations applies + int rem = tid & 127; + i1 = (tid << 1) - rem; + i2 = i1 + 128; + double2 w = negTwids8[rem]; + u = A[i1], v = A[i2] * w; + A[i1] = u + v; + A[i2] = u - v; + tid += params::degree / params::opt; + } + __syncthreads(); + if constexpr (params::log2_degree > 8) { + // 9_th iteration + tid = threadIdx.x; +#pragma unroll + for (int i = 0; i < params::opt / 2; i++) { + // the butterfly pattern is applied to each pair + // of coefficients, with a stride of 256 + // rem is the remainder of tid/256 + // and the same logic as for previous iterations applies + int rem = tid & 255; + i1 = (tid << 1) - rem; + i2 = i1 + 256; + double2 w = negTwids9[rem]; + u = A[i1], v = A[i2] * w; + A[i1] = u + v; + A[i2] = u - v; + tid += params::degree / params::opt; + } + __syncthreads(); + } + if constexpr (params::log2_degree > 9) { + // 10_th iteration + tid = threadIdx.x; + //#pragma unroll + for (int i = 0; i < params::opt / 2; i++) { + // the butterfly pattern is applied to each pair + // of coefficients, with a stride of 512 + // rem is the remainder of tid/512 + // and the same logic as for previous iterations applies + int rem = tid & 511; + i1 = (tid << 1) - rem; + i2 = i1 + 512; + double2 w = negTwids10[rem]; + u = A[i1], v = A[i2] * w; + A[i1] = u + v; + A[i2] = u - v; + tid += params::degree / params::opt; + } + __syncthreads(); + } + + if constexpr (params::log2_degree > 10) { + // 11_th iteration + tid = threadIdx.x; + //#pragma unroll + for (int i = 0; i < params::opt / 2; i++) { + // the butterfly pattern is applied to each pair + // of coefficients, with a stride of 1024 + // rem is the remainder of tid/1024 + // and the same logic as for previous iterations applies + int rem = tid & 1023; + i1 = (tid << 1) - rem; + i2 = i1 + 1024; + double2 w = negTwids11[rem]; + u = A[i1], v = A[i2] * w; + A[i1] = u + v; + A[i2] = u - v; + tid += params::degree / params::opt; + } + __syncthreads(); + } + + if constexpr (params::log2_degree > 11) { + // 12_th iteration + tid = threadIdx.x; + //#pragma unroll + for (int i = 0; i < params::opt / 2; i++) { + // the butterfly pattern is applied to each pair + // of coefficients, with a stride of 2048 + // rem is the remainder of tid/2048 + // and the same logic as for previous iterations applies + int rem = tid & 2047; + i1 = (tid << 1) - rem; + i2 = i1 + 2048; + double2 w = negTwids12[rem]; + u = A[i1], v = A[i2] * w; + A[i1] = u + v; + A[i2] = u - v; + tid += params::degree / params::opt; + } + __syncthreads(); + } + // Real polynomials handled should not exceed a degree of 8192 +} + +/* + * negacyclic inverse fft + */ +template __device__ void NSMFFT_inverse(double2 *A) { + /* First, reverse the bits of the input complex + * The bit reversal for half-size FFT has been stored into the + * SW1 and SW2 arrays beforehand + * Each thread is always in charge of "opt/2" pairs of coefficients, + * which is why we always loop through N/2 by N/opt strides + * The pragma unroll instruction tells the compiler to unroll the + * full loop, which should increase performance TODO (Agnes) check this + */ + int tid; + int i1, i2; + double2 u, v; + if constexpr (params::log2_degree > 11) { + // 12_th iteration + tid = threadIdx.x; + //#pragma unroll + for (int i = 0; i < params::opt / 2; i++) { + // the butterfly pattern is applied to each pair + // of coefficients, with a stride of 2048 + // rem is the remainder of tid/2048 + // and the same logic as for previous iterations applies + int rem = tid & 2047; + i1 = (tid << 1) - rem; + i2 = i1 + 2048; + double2 w = conjugate(negTwids12[rem]); + u = A[i1], v = A[i2]; + A[i1] = (u + v) * 0.5; + A[i2] = (u - v) * w * 0.5; + tid += params::degree / params::opt; + } + __syncthreads(); + } + + if constexpr (params::log2_degree > 10) { + // 11_th iteration + tid = threadIdx.x; + //#pragma unroll + for (int i = 0; i < params::opt / 2; i++) { + // the butterfly pattern is applied to each pair + // of coefficients, with a stride of 1024 + // rem is the remainder of tid/1024 + // and the same logic as for previous iterations applies + int rem = tid & 1023; + i1 = (tid << 1) - rem; + i2 = i1 + 1024; + double2 w = conjugate(negTwids11[rem]); + u = A[i1], v = A[i2]; + A[i1] = (u + v) * 0.5; + A[i2] = (u - v) * w * 0.5; + tid += params::degree / params::opt; + } + __syncthreads(); + } + + if constexpr (params::log2_degree > 9) { + // 10_th iteration + tid = threadIdx.x; + //#pragma unroll + for (int i = 0; i < params::opt / 2; i++) { + // the butterfly pattern is applied to each pair + // of coefficients, with a stride of 512 + // rem is the remainder of tid/512 + // and the same logic as for previous iterations applies + int rem = tid & 511; + i1 = (tid << 1) - rem; + i2 = i1 + 512; + double2 w = conjugate(negTwids10[rem]); + u = A[i1], v = A[i2]; + A[i1] = (u + v) * 0.5; + A[i2] = (u - v) * w * 0.5; + tid += params::degree / params::opt; + } + __syncthreads(); + } + + if constexpr (params::log2_degree > 8) { + // 9_th iteration + tid = threadIdx.x; +#pragma unroll + for (int i = 0; i < params::opt / 2; i++) { + // the butterfly pattern is applied to each pair + // of coefficients, with a stride of 256 + // rem is the remainder of tid/256 + // and the same logic as for previous iterations applies + int rem = tid & 255; + i1 = (tid << 1) - rem; + i2 = i1 + 256; + double2 w = conjugate(negTwids9[rem]); + u = A[i1], v = A[i2]; + A[i1] = (u + v) * 0.5; + A[i2] = (u - v) * w * 0.5; + tid += params::degree / params::opt; + } + __syncthreads(); + } + + // 8_th iteration + tid = threadIdx.x; +#pragma unroll + for (int i = 0; i < params::opt / 2; i++) { + // the butterfly pattern is applied to each pair + // of coefficients, with a stride of 128 + // rem is the remainder of tid/128 + // and the same logic as for previous iterations applies + int rem = tid & 127; + i1 = (tid << 1) - rem; + i2 = i1 + 128; + double2 w = conjugate(negTwids8[rem]); + u = A[i1], v = A[i2]; + A[i1] = (u + v) * 0.5; + A[i2] = (u - v) * w * 0.5; + tid += params::degree / params::opt; + } + __syncthreads(); + + // 7_th iteration + tid = threadIdx.x; +#pragma unroll + for (int i = 0; i < params::opt / 2; i++) { + // the butterfly pattern is applied to each pair + // of coefficients, with a stride of 64 + // rem is the remainder of tid/64 + // and the same logic as for previous iterations applies + int rem = tid & 63; + i1 = (tid << 1) - rem; + i2 = i1 + 64; + double2 w = conjugate(negTwids7[rem]); + u = A[i1], v = A[i2]; + A[i1] = (u + v) * 0.5; + A[i2] = (u - v) * w * 0.5; + tid += params::degree / params::opt; + } + __syncthreads(); + + // 6_th iteration + tid = threadIdx.x; +#pragma unroll + for (int i = 0; i < params::opt / 2; i++) { + // the butterfly pattern is applied to each pair + // of coefficients, with a stride of 32 + // rem is the remainder of tid/32 + // and the same logic as for previous iterations applies + int rem = tid & 31; + i1 = (tid << 1) - rem; + i2 = i1 + 32; + double2 w = conjugate(negTwids6[rem]); + u = A[i1], v = A[i2]; + A[i1] = (u + v) * 0.5; + A[i2] = (u - v) * w * 0.5; + tid += params::degree / params::opt; + } + __syncthreads(); + + // 5_th iteration + tid = threadIdx.x; +#pragma unroll + for (int i = 0; i < params::opt / 2; i++) { + // the butterfly pattern is applied to each pair + // of coefficients, with a stride of 16 + // rem is the remainder of tid/16 + // and the same logic as for previous iterations applies + int rem = tid & 15; + i1 = (tid << 1) - rem; + i2 = i1 + 16; + double2 w = conjugate(negTwids5[rem]); + u = A[i1], v = A[i2]; + A[i1] = (u + v) * 0.5; + A[i2] = (u - v) * w * 0.5; + tid += params::degree / params::opt; + } + __syncthreads(); + + // 4_th iteration + tid = threadIdx.x; +#pragma unroll + for (int i = 0; i < params::opt / 2; i++) { + // the butterfly pattern is applied to each pair + // of coefficients, with a stride of 8 + // rem is the remainder of tid/8. tid takes values: + // 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ... N/4 + // then rem takes values: + // 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, ... N/4 + // and striding by 8 will allow us to cover all + // the coefficients correctly + int rem = tid & 7; + i1 = (tid << 1) - rem; + i2 = i1 + 8; + + double2 w = conjugate(negTwids4[rem]); + u = A[i1], v = A[i2]; + A[i1] = (u + v) * 0.5; + A[i2] = (u - v) * w * 0.5; + tid += params::degree / params::opt; + } + __syncthreads(); + + // third iteration + // from k=3 on, we have to do the full complex multiplication + tid = threadIdx.x; +#pragma unroll + for (int i = 0; i < params::opt / 2; i++) { + // the butterfly pattern is applied to each pair + // of coefficients, with a stride of 4 + // rem is the remainder of tid/4. tid takes values: + // 0, 1, 2, 3, 4, 5, 6, 7, ... N/4 + // then rem takes values: + // 0, 1, 2, 3, 0, 1, 2, 3, ... N/4 + // and striding by 4 will allow us to cover all + // the coefficients correctly + int rem = tid & 3; + i1 = (tid << 1) - rem; + i2 = i1 + 4; + + double2 w = conjugate(negTwids3[rem]); + u = A[i1], v = A[i2]; + A[i1] = (u + v) * 0.5; + A[i2] = (u - v) * w * 0.5; + tid += params::degree / params::opt; + } + __syncthreads(); + + // second iteration: apply the butterfly pattern + // between groups of 4 coefficients + // k=2, \zeta=exp(i pi/4) for even coefficients and + // exp(3 i pi / 4) for odd coefficients + // TODO (Agnes) how does this work on the gpu? aren't we doing + // a lot more computations than we should? + tid = threadIdx.x; + // odd = 0 for even coefficients, 1 for odd coefficients + int odd = tid & 1; +#pragma unroll + for (int i = 0; i < params::opt / 2; i++) { + // the butterfly pattern is applied to each pair + // of coefficients, with a stride of 2 + // i1=2*tid if tid is even and 2*tid-1 if it is odd + i1 = (tid << 1) - odd; + i2 = i1 + 2; + + // TODO(Beka) optimize twiddle multiplication + double2 w; + if (odd) { + w.x = -0.707106781186547461715008466854; + w.y = -0.707106781186547572737310929369; + } else { + w.x = 0.707106781186547461715008466854; + w.y = -0.707106781186547572737310929369; + } + + u = A[i1], v = A[i2]; + A[i1] = (u + v) * 0.5; + A[i2] = (u - v) * w * 0.5; + tid += params::degree / params::opt; + } + __syncthreads(); + + // Now we go through all the levels of the FFT one by one + // (instead of recursively) + // first iteration: k=1, zeta=i for all coefficients + tid = threadIdx.x; +#pragma unroll + for (int i = 0; i < params::opt / 2; i++) { + // the butterfly pattern is applied to each pair + // of coefficients, with a stride of 2 + i1 = tid << 1; + i2 = i1 + 1; + // TODO(Beka) optimize twiddle multiplication + double2 w = {0, -1}; + u = A[i1], v = A[i2]; + A[i1] = (u + v) * 0.5; + A[i2] = (u - v) * w * 0.5; + tid += params::degree / params::opt; + } + __syncthreads(); + + bit_reverse_inplace(A); + __syncthreads(); + // Real polynomials handled should not exceed a degree of 8192 +} + +/* + * correction after direct fft + * does not use extra shared memory for recovering + * correction is done using registers. + * based on Pascal's paper + */ +template +__device__ void correction_direct_fft_inplace(double2 *x) { + constexpr int threads = params::degree / params::opt; + int tid = threadIdx.x; + double2 left[params::opt / 4]; + double2 right[params::opt / 4]; +#pragma unroll + for (int i = 0; i < params::opt / 4; i++) { + left[i] = x[tid + i * threads]; + } +#pragma unroll + for (int i = 0; i < params::opt / 4; i++) { + right[i] = x[params::degree / 2 - (tid + i * threads + 1)]; + } +#pragma unroll + for (int i = 0; i < params::opt / 4; i++) { + double2 tw = negacyclic_twiddle(tid + i * threads); + double add_RE = left[i].x + right[i].x; + double sub_RE = left[i].x - right[i].x; + double add_IM = left[i].y + right[i].y; + double sub_IM = left[i].y - right[i].y; + + double tmp1 = add_IM * tw.x + sub_RE * tw.y; + double tmp2 = -sub_RE * tw.x + add_IM * tw.y; + x[tid + i * threads].x = (add_RE + tmp1) * 0.5; + x[tid + i * threads].y = (sub_IM + tmp2) * 0.5; + x[params::degree / 2 - (tid + i * threads + 1)].x = (add_RE - tmp1) * 0.5; + x[params::degree / 2 - (tid + i * threads + 1)].y = (-sub_IM + tmp2) * 0.5; + } +} + +/* + * correction before inverse fft + * does not use extra shared memory for recovering + * correction is done using registers. + * based on Pascal's paper + */ +template +__device__ void correction_inverse_fft_inplace(double2 *x) { + constexpr int threads = params::degree / params::opt; + int tid = threadIdx.x; + double2 left[params::opt / 4]; + double2 right[params::opt / 4]; +#pragma unroll + for (int i = 0; i < params::opt / 4; i++) { + left[i] = x[tid + i * threads]; + } +#pragma unroll + for (int i = 0; i < params::opt / 4; i++) { + right[i] = x[params::degree / 2 - (tid + i * threads + 1)]; + } +#pragma unroll + for (int i = 0; i < params::opt / 4; i++) { + double2 tw = negacyclic_twiddle(tid + i * threads); + double add_RE = left[i].x + right[i].x; + double sub_RE = left[i].x - right[i].x; + double add_IM = left[i].y + right[i].y; + double sub_IM = left[i].y - right[i].y; + + double tmp1 = add_IM * tw.x - sub_RE * tw.y; + double tmp2 = sub_RE * tw.x + add_IM * tw.y; + x[tid + i * threads].x = (add_RE - tmp1) * 0.5; + x[tid + i * threads].y = (sub_IM + tmp2) * 0.5; + x[params::degree / 2 - (tid + i * threads + 1)].x = (add_RE + tmp1) * 0.5; + x[params::degree / 2 - (tid + i * threads + 1)].y = (-sub_IM + tmp2) * 0.5; + } +} + +/* + * global batch fft + * does fft in half size + * unrolling halfsize fft result in half size + 1 eleemnts + * this function must be called with actual degree + * function takes as input already compressed input + */ +template +__global__ void batch_NSMFFT(double2 *d_input, double2 *d_output) { + extern __shared__ double2 sharedMemoryFFT[]; + double2 *fft = sharedMemoryFFT; + + int tid = threadIdx.x; + +#pragma unroll + for (int i = 0; i < params::opt / 2; i++) { + fft[tid] = d_input[blockIdx.x * (params::degree / 2) + tid]; + tid = tid + params::degree / params::opt; + } + __syncthreads(); + NSMFFT_direct>(fft); + __syncthreads(); + correction_direct_fft_inplace(fft); + __syncthreads(); + + tid = threadIdx.x; +#pragma unroll + for (int i = 0; i < params::opt / 2; i++) { + d_output[blockIdx.x * (params::degree / 2) + tid] = fft[tid]; + tid = tid + params::degree / params::opt; + } +} + +#endif // GPU_BOOTSTRAP_FFT_1024_CUH diff --git a/src/fft/smfft.cuh b/src/fft/smfft.cuh new file mode 100644 index 000000000..bc31d42a3 --- /dev/null +++ b/src/fft/smfft.cuh @@ -0,0 +1,402 @@ +/* +#ifndef GPU_BOOTSTRAP_SMFFT_CUH +#define GPU_BOOTSTRAP_SMFFT_CUH + +#include "../complex/operations.cuh" +#include "twiddles.cuh" + +__device__ __inline__ double2 Get_W_value_inverse(int index) { + double2 ctemp = _gTwiddles[index]; + ctemp.y = -ctemp.y; + return (ctemp); +} +template +__device__ double2 Get_after_inverse_fft_twiddle(int index) { + double2 ctemp; + switch (params::degree) { + case 512: + ctemp = INVERSE_TWIDDLES_512[index]; + break; + case 1024: + ctemp = gTwiddles1024[index]; + ctemp.x /= params::degree; + ctemp.y /= -params::degree; + break; + default: + break; + } + + return ctemp; +} + +__device__ __inline__ double shfl(double *value, int par) { +#if (CUDART_VERSION >= 9000) + return (__shfl_sync(0xffffffff, (*value), par)); +#else + return (__shfl((*value), par)); +#endif +} + +__device__ __inline__ double shfl_xor(double *value, int par) { +#if (CUDART_VERSION >= 9000) + return (__shfl_xor_sync(0xffffffff, (*value), par)); +#else + return (__shfl_xor((*value), par)); +#endif +} + +__device__ __inline__ double shfl_down(double *value, int par) { +#if (CUDART_VERSION >= 9000) + return (__shfl_down_sync(0xffffffff, (*value), par)); +#else + return (__shfl_down((*value), par)); +#endif +} + +__device__ __inline__ void +reorder_16_register(double2 *A_DFT_value, double2 *B_DFT_value, + double2 *C_DFT_value, double2 *D_DFT_value, int *local_id) { + double2 Af2temp, Bf2temp, Cf2temp, Df2temp; + unsigned int target = (((unsigned int)__brev(((*local_id) & 15))) >> (28)) + + 16 * ((*local_id) >> 4); + Af2temp.x = shfl(&(A_DFT_value->x), target); + Af2temp.y = shfl(&(A_DFT_value->y), target); + Bf2temp.x = shfl(&(B_DFT_value->x), target); + Bf2temp.y = shfl(&(B_DFT_value->y), target); + Cf2temp.x = shfl(&(C_DFT_value->x), target); + Cf2temp.y = shfl(&(C_DFT_value->y), target); + Df2temp.x = shfl(&(D_DFT_value->x), target); + Df2temp.y = shfl(&(D_DFT_value->y), target); + __syncwarp(); + (*A_DFT_value) = Af2temp; + (*B_DFT_value) = Bf2temp; + (*C_DFT_value) = Cf2temp; + (*D_DFT_value) = Df2temp; +} + +__device__ __inline__ void reorder_32_register(double2 *A_DFT_value, + double2 *B_DFT_value, + double2 *C_DFT_value, + double2 *D_DFT_value) { + double2 Af2temp, Bf2temp, Cf2temp, Df2temp; + unsigned int target = ((unsigned int)__brev(threadIdx.x)) >> (27); + Af2temp.x = shfl(&(A_DFT_value->x), target); + Af2temp.y = shfl(&(A_DFT_value->y), target); + Bf2temp.x = shfl(&(B_DFT_value->x), target); + Bf2temp.y = shfl(&(B_DFT_value->y), target); + Cf2temp.x = shfl(&(C_DFT_value->x), target); + Cf2temp.y = shfl(&(C_DFT_value->y), target); + Df2temp.x = shfl(&(D_DFT_value->x), target); + Df2temp.y = shfl(&(D_DFT_value->y), target); + __syncwarp(); + (*A_DFT_value) = Af2temp; + (*B_DFT_value) = Bf2temp; + (*C_DFT_value) = Cf2temp; + (*D_DFT_value) = Df2temp; +} + +template +__device__ __inline__ void +reorder_512(double2 *s_input, double2 *A_DFT_value, double2 *B_DFT_value, + double2 *C_DFT_value, double2 *D_DFT_value) { + int local_id = threadIdx.x & (params::warp - 1); + int warp_id = threadIdx.x / params::warp; + + // reorder elements within warp so we can save them in semi-transposed manner + // into shared memory + reorder_32_register(A_DFT_value, B_DFT_value, C_DFT_value, D_DFT_value); + + // reorder elements within warp so we can save them in semi-transposed manner + // into shared memory + __syncthreads(); + unsigned int sm_store_pos = + (local_id >> 1) + 16 * (local_id & 1) + warp_id * 132; + s_input[sm_store_pos] = *A_DFT_value; + s_input[sm_store_pos + 33] = *B_DFT_value; + s_input[66 + sm_store_pos] = *C_DFT_value; + s_input[66 + sm_store_pos + 33] = *D_DFT_value; + + __syncthreads(); + + // Read shared memory to get reordered input + unsigned int sm_read_pos = (local_id & 15) * 32 + local_id + warp_id * 4; + __syncthreads(); + *A_DFT_value = s_input[sm_read_pos + 0]; + *B_DFT_value = s_input[sm_read_pos + 1]; + *C_DFT_value = s_input[sm_read_pos + 2]; + *D_DFT_value = s_input[sm_read_pos + 3]; + + __syncthreads(); + reorder_16_register(A_DFT_value, B_DFT_value, C_DFT_value, D_DFT_value, + &local_id); + + __syncthreads(); +} + +template +__device__ __inline__ void +reorder_1024(double2 *s_input, double2 *A_DFT_value, double2 *B_DFT_value, + double2 *C_DFT_value, double2 *D_DFT_value) { + int local_id = threadIdx.x & (params::warp - 1); + int warp_id = threadIdx.x / params::warp; + + // reorder elements within params::warp so we can save them in semi-transposed + // manner into shared memory + reorder_32_register(A_DFT_value, B_DFT_value, C_DFT_value, D_DFT_value); + + // reorder elements within params::warp so we can save them in semi-transposed + // manner into shared memory + __syncthreads(); + unsigned int sm_store_pos = + (local_id >> 0) + 32 * (local_id & 0) + warp_id * 132; + s_input[sm_store_pos] = *A_DFT_value; + s_input[sm_store_pos + 33] = *B_DFT_value; + s_input[66 + sm_store_pos] = *C_DFT_value; + s_input[66 + sm_store_pos + 33] = *D_DFT_value; + + // Read shared memory to get reordered input + unsigned int sm_read_pos = (local_id & 31) * 32 + local_id + warp_id * 4; + __syncthreads(); + *A_DFT_value = s_input[sm_read_pos + 0]; + *B_DFT_value = s_input[sm_read_pos + 1]; + *C_DFT_value = s_input[sm_read_pos + 2]; + *D_DFT_value = s_input[sm_read_pos + 3]; + + __syncthreads(); + reorder_32_register(A_DFT_value, B_DFT_value, C_DFT_value, D_DFT_value); +} + +__device__ bool printOnce = true; + +template __device__ void do_SMFFT_CT_DIT(double2 *s_input) { + double2 A_DFT_value, B_DFT_value, C_DFT_value, D_DFT_value; + double2 W; + double2 Aftemp, Bftemp, Cftemp, Dftemp; + + int j, m_param; + int parity, itemp; + int A_read_index, B_read_index, C_read_index, D_read_index; + int PoT, PoTp1, q; + + int local_id = threadIdx.x & (params::warp - 1); + int warp_id = threadIdx.x / params::warp; + A_DFT_value = s_input[local_id + (warp_id << 2) * params::warp]; + B_DFT_value = + s_input[local_id + (warp_id << 2) * params::warp + params::warp]; + C_DFT_value = + s_input[local_id + (warp_id << 2) * params::warp + 2 * params::warp]; + D_DFT_value = + s_input[local_id + (warp_id << 2) * params::warp + 3 * params::warp]; + + switch (params::log2_degree) { + case 9: + reorder_512(s_input, &A_DFT_value, &B_DFT_value, &C_DFT_value, + &D_DFT_value); + break; + case 10: + reorder_1024(s_input, &A_DFT_value, &B_DFT_value, &C_DFT_value, + &D_DFT_value); + break; + // case 11: + // reorder_2048(s_input, &A_DFT_value, &B_DFT_value, + //&C_DFT_value, &D_DFT_value); break; + default: + break; + } + + //----> FFT + PoT = 1; + PoTp1 = 2; + + //--> First iteration + itemp = local_id & 1; + parity = (1 - itemp * 2); + + A_DFT_value.x = parity * A_DFT_value.x + shfl_xor(&A_DFT_value.x, 1); + A_DFT_value.y = parity * A_DFT_value.y + shfl_xor(&A_DFT_value.y, 1); + B_DFT_value.x = parity * B_DFT_value.x + shfl_xor(&B_DFT_value.x, 1); + B_DFT_value.y = parity * B_DFT_value.y + shfl_xor(&B_DFT_value.y, 1); + C_DFT_value.x = parity * C_DFT_value.x + shfl_xor(&C_DFT_value.x, 1); + C_DFT_value.y = parity * C_DFT_value.y + shfl_xor(&C_DFT_value.y, 1); + D_DFT_value.x = parity * D_DFT_value.x + shfl_xor(&D_DFT_value.x, 1); + D_DFT_value.y = parity * D_DFT_value.y + shfl_xor(&D_DFT_value.y, 1); + + //--> Second through Fifth iteration (no synchronization) + PoT = 2; + PoTp1 = 4; + for (q = 1; q < 5; q++) { + m_param = (local_id & (PoTp1 - 1)); + itemp = m_param >> q; + parity = ((itemp << 1) - 1); + if (params::fft_direction) + W = Get_W_value_inverse((q - 1) * 257 + itemp * m_param); + else + W = _gTwiddles[(q - 1) * 257 + itemp * m_param]; + Aftemp.x = W.x * A_DFT_value.x - W.y * A_DFT_value.y; + Aftemp.y = W.x * A_DFT_value.y + W.y * A_DFT_value.x; + Bftemp.x = W.x * B_DFT_value.x - W.y * B_DFT_value.y; + Bftemp.y = W.x * B_DFT_value.y + W.y * B_DFT_value.x; + Cftemp.x = W.x * C_DFT_value.x - W.y * C_DFT_value.y; + Cftemp.y = W.x * C_DFT_value.y + W.y * C_DFT_value.x; + Dftemp.x = W.x * D_DFT_value.x - W.y * D_DFT_value.y; + Dftemp.y = W.x * D_DFT_value.y + W.y * D_DFT_value.x; + + A_DFT_value.x = Aftemp.x + parity * shfl_xor(&Aftemp.x, PoT); + A_DFT_value.y = Aftemp.y + parity * shfl_xor(&Aftemp.y, PoT); + B_DFT_value.x = Bftemp.x + parity * shfl_xor(&Bftemp.x, PoT); + B_DFT_value.y = Bftemp.y + parity * shfl_xor(&Bftemp.y, PoT); + C_DFT_value.x = Cftemp.x + parity * shfl_xor(&Cftemp.x, PoT); + C_DFT_value.y = Cftemp.y + parity * shfl_xor(&Cftemp.y, PoT); + D_DFT_value.x = Dftemp.x + parity * shfl_xor(&Dftemp.x, PoT); + D_DFT_value.y = Dftemp.y + parity * shfl_xor(&Dftemp.y, PoT); + + PoT = PoT << 1; + PoTp1 = PoTp1 << 1; + } + + itemp = local_id + (warp_id << 2) * params::warp; + s_input[itemp] = A_DFT_value; + s_input[itemp + params::warp] = B_DFT_value; + s_input[itemp + 2 * params::warp] = C_DFT_value; + s_input[itemp + 3 * params::warp] = D_DFT_value; + + for (q = 5; q < (params::log2_degree - 1); q++) { + __syncthreads(); + m_param = threadIdx.x & (PoT - 1); + j = threadIdx.x >> q; + + if (params::fft_direction) + W = Get_W_value_inverse((q - 1) * 257 + m_param); + else + W = _gTwiddles[(q - 1) * 257 + m_param]; + + A_read_index = j * (PoTp1 << 1) + m_param; + B_read_index = j * (PoTp1 << 1) + m_param + PoT; + C_read_index = j * (PoTp1 << 1) + m_param + PoTp1; + D_read_index = j * (PoTp1 << 1) + m_param + 3 * PoT; + + Aftemp = s_input[A_read_index]; + Bftemp = s_input[B_read_index]; + A_DFT_value.x = Aftemp.x + W.x * Bftemp.x - W.y * Bftemp.y; + A_DFT_value.y = Aftemp.y + W.x * Bftemp.y + W.y * Bftemp.x; + B_DFT_value.x = Aftemp.x - W.x * Bftemp.x + W.y * Bftemp.y; + B_DFT_value.y = Aftemp.y - W.x * Bftemp.y - W.y * Bftemp.x; + + Cftemp = s_input[C_read_index]; + Dftemp = s_input[D_read_index]; + C_DFT_value.x = Cftemp.x + W.x * Dftemp.x - W.y * Dftemp.y; + C_DFT_value.y = Cftemp.y + W.x * Dftemp.y + W.y * Dftemp.x; + D_DFT_value.x = Cftemp.x - W.x * Dftemp.x + W.y * Dftemp.y; + D_DFT_value.y = Cftemp.y - W.x * Dftemp.y - W.y * Dftemp.x; + + s_input[A_read_index] = A_DFT_value; + s_input[B_read_index] = B_DFT_value; + s_input[C_read_index] = C_DFT_value; + s_input[D_read_index] = D_DFT_value; + + PoT = PoT << 1; + PoTp1 = PoTp1 << 1; + } + + // last iteration + if (params::log2_degree > 6) { + __syncthreads(); + m_param = threadIdx.x; + + if (params::fft_direction) + W = Get_W_value_inverse((q - 1) * 257 + m_param); + else + W = _gTwiddles[(q - 1) * 257 + m_param]; + + A_read_index = m_param; + B_read_index = m_param + PoT; + C_read_index = m_param + (PoT >> 1); + D_read_index = m_param + 3 * (PoT >> 1); + + Aftemp = s_input[A_read_index]; + Bftemp = s_input[B_read_index]; + A_DFT_value.x = Aftemp.x + W.x * Bftemp.x - W.y * Bftemp.y; + A_DFT_value.y = Aftemp.y + W.x * Bftemp.y + W.y * Bftemp.x; + B_DFT_value.x = Aftemp.x - W.x * Bftemp.x + W.y * Bftemp.y; + B_DFT_value.y = Aftemp.y - W.x * Bftemp.y - W.y * Bftemp.x; + + Cftemp = s_input[C_read_index]; + Dftemp = s_input[D_read_index]; + C_DFT_value.x = Cftemp.x + W.y * Dftemp.x + W.x * Dftemp.y; + C_DFT_value.y = Cftemp.y + W.y * Dftemp.y - W.x * Dftemp.x; + D_DFT_value.x = Cftemp.x - W.y * Dftemp.x - W.x * Dftemp.y; + D_DFT_value.y = Cftemp.y - W.y * Dftemp.y + W.x * Dftemp.x; + + s_input[A_read_index] = A_DFT_value; + s_input[B_read_index] = B_DFT_value; + s_input[C_read_index] = C_DFT_value; + s_input[D_read_index] = D_DFT_value; + } +} + +template +__global__ void SMFFT_DIT_external(double2 *d_input, double2 *d_output) { + __syncthreads(); + + extern __shared__ double2 sharedmemBSK[]; + + double2 *s_input = sharedmemBSK; + + int cTid = threadIdx.x * params::opt; +#pragma unroll + for (int i = 0; i < params::opt; i++) { + double2 tmp; + switch (params::degree) { + case 512: + tmp = INVERSE_TWIDDLES_512[cTid]; + tmp.x *= params::degree; + tmp.y *= -params::degree; + break; + case 1024: + tmp = gTwiddles1024[cTid]; + break; + default: + break; + } + + d_input[blockIdx.x * params::degree + cTid] *= tmp; + cTid++; + } + + __syncthreads(); + + s_input[threadIdx.x] = d_input[threadIdx.x + blockIdx.x * params::degree]; + s_input[threadIdx.x + params::quarter] = + d_input[threadIdx.x + blockIdx.x * params::degree + params::quarter]; + s_input[threadIdx.x + params::half] = + d_input[threadIdx.x + blockIdx.x * params::degree + params::half]; + s_input[threadIdx.x + params::three_quarters] = + d_input[threadIdx.x + blockIdx.x * params::degree + + params::three_quarters]; + + __syncthreads(); + + do_SMFFT_CT_DIT(s_input); + if (threadIdx.x == 0 && blockIdx.x == 0) { + for (int i = 0; i < 1024; i++) + printf("smfft[%u] %.10f %.10f\n", i, s_input[i].x, s_input[i].y); + } + __syncthreads(); + + + + __syncthreads(); + d_output[threadIdx.x + blockIdx.x * params::degree] = s_input[threadIdx.x]; + d_output[threadIdx.x + blockIdx.x * params::degree + params::quarter] = + s_input[threadIdx.x + params::quarter]; + d_output[threadIdx.x + blockIdx.x * params::degree + params::half] = + s_input[threadIdx.x + params::half]; + d_output[threadIdx.x + blockIdx.x * params::degree + params::three_quarters] = + s_input[threadIdx.x + params::three_quarters]; + + __syncthreads(); +} + +#endif // GPU_BOOTSTRAP_SMFFT_CUH + +*/ \ No newline at end of file diff --git a/src/fft/twiddles.cu b/src/fft/twiddles.cu new file mode 100644 index 000000000..c51b3784a --- /dev/null +++ b/src/fft/twiddles.cu @@ -0,0 +1,8204 @@ +#include "cuComplex.h" + +__constant__ short SW1[2048]; +__constant__ short SW2[2048]; + +__constant__ double2 negTwids3[4] = { + {0.923879532511286738483136105060, 0.382683432365089781779232680492}, + {0.382683432365089837290383911750, 0.923879532511286738483136105060}, + {-0.382683432365089726268081449234, 0.923879532511286738483136105060}, + {-0.923879532511286738483136105060, 0.382683432365089892801535143008}}; +__constant__ double2 negTwids4[8] = { + {0.980785280403230430579242238309, 0.195090322016128248083788321310}, + {0.831469612302545235671402679145, 0.555570233019602177648721408332}, + {0.555570233019602288671023870847, 0.831469612302545235671402679145}, + {0.195090322016128331350515168197, 0.980785280403230430579242238309}, + {-0.195090322016128192572637090052, 0.980785280403230430579242238309}, + {-0.555570233019601955604116483300, 0.831469612302545457716007604176}, + {-0.831469612302545346693705141661, 0.555570233019602177648721408332}, + {-0.980785280403230430579242238309, 0.195090322016128608906271324486}}; +__constant__ double2 negTwids5[16] = { + {0.995184726672196928731750631414, 0.098017140329560603628777926133}, + {0.956940335732208824381928025105, 0.290284677254462331053019852334}, + {0.881921264348355049556005269551, 0.471396736825997642039709489836}, + {0.773010453362736993376813643408, 0.634393284163645487794269683945}, + {0.634393284163645487794269683945, 0.773010453362736993376813643408}, + {0.471396736825997808573163183610, 0.881921264348354938533702807035}, + {0.290284677254462331053019852334, 0.956940335732208935404230487620}, + {0.098017140329560770162231619906, 0.995184726672196817709448168898}, + {-0.098017140329560645262141349576, 0.995184726672196928731750631414}, + {-0.290284677254462164519566158560, 0.956940335732208935404230487620}, + {-0.471396736825997697550860721094, 0.881921264348355049556005269551}, + {-0.634393284163645376771967221430, 0.773010453362737104399116105924}, + {-0.773010453362736993376813643408, 0.634393284163645487794269683945}, + {-0.881921264348354938533702807035, 0.471396736825997864084314414868}, + {-0.956940335732208824381928025105, 0.290284677254462386564171083592}, + {-0.995184726672196817709448168898, 0.098017140329560825673382851164}}; +__constant__ double2 negTwids6[32] = { + {0.998795456205172405006464941835, 0.049067674327418014934565348995}, + {0.989176509964781014438983675063, 0.146730474455361747931902982600}, + {0.970031253194543974238683858857, 0.242980179903263870944130076168}, + {0.941544065183020806308888950298, 0.336889853392220051109262612954}, + {0.903989293123443338195954765979, 0.427555093430282084909777040593}, + {0.857728610000272118085717920621, 0.514102744193221661284098900069}, + {0.803207531480644942867286317778, 0.595699304492433356905678465409}, + {0.740951125354959105884233849793, 0.671558954847018330092112137208}, + {0.671558954847018330092112137208, 0.740951125354959105884233849793}, + {0.595699304492433467927980927925, 0.803207531480644831844983855262}, + {0.514102744193221661284098900069, 0.857728610000272118085717920621}, + {0.427555093430282195932079503109, 0.903989293123443338195954765979}, + {0.336889853392220051109262612954, 0.941544065183020806308888950298}, + {0.242980179903263981966432538684, 0.970031253194543974238683858857}, + {0.146730474455361747931902982600, 0.989176509964781014438983675063}, + {0.049067674327418125956867811510, 0.998795456205172405006464941835}, + {-0.049067674327418007995671445087, 0.998795456205172405006464941835}, + {-0.146730474455361636909600520084, 0.989176509964781014438983675063}, + {-0.242980179903263870944130076168, 0.970031253194543974238683858857}, + {-0.336889853392219940086960150438, 0.941544065183020806308888950298}, + {-0.427555093430281862865172115562, 0.903989293123443449218257228495}, + {-0.514102744193221661284098900069, 0.857728610000272118085717920621}, + {-0.595699304492433356905678465409, 0.803207531480644942867286317778}, + {-0.671558954847018441114414599724, 0.740951125354958994861931387277}, + {-0.740951125354958883839628924761, 0.671558954847018552136717062240}, + {-0.803207531480644831844983855262, 0.595699304492433467927980927925}, + {-0.857728610000272007063415458106, 0.514102744193221772306401362584}, + {-0.903989293123443338195954765979, 0.427555093430282029398625809335}, + {-0.941544065183020695286586487782, 0.336889853392220328665018769243}, + {-0.970031253194543974238683858857, 0.242980179903264065233159385571}, + {-0.989176509964781014438983675063, 0.146730474455361803443054213858}, + {-0.998795456205172405006464941835, 0.049067674327417966362308021644}}; +__constant__ double2 negTwids7[64] = { + {0.999698818696204249967252053466, 0.024541228522912288123603019585}, + {0.997290456678690206970827603072, 0.073564563599667426307959772203}, + {0.992479534598709967063712156232, 0.122410675199216195663254325154}, + {0.985277642388941221618381405278, 0.170961888760301217171644339032}, + {0.975702130038528570032951847679, 0.219101240156869797592875670489}, + {0.963776065795439840222513794288, 0.266712757474898365384063936290}, + {0.949528180593036674750351266994, 0.313681740398891517607182777283}, + {0.932992798834738956692547162675, 0.359895036534988110865640464908}, + {0.914209755703530690951197357208, 0.405241314004989860997341111215}, + {0.893224301195515324458540362684, 0.449611329654606539651950924963}, + {0.870086991108711460540803273034, 0.492898192229784037898809856415}, + {0.844853565249707116890931501985, 0.534997619887097153323907150479}, + {0.817584813151583711388070696557, 0.575808191417845338655467912758}, + {0.788346427626606338634474013816, 0.615231590580626819253495796147}, + {0.757208846506484567484562830941, 0.653172842953776755514638807654}, + {0.724247082951467002764900371403, 0.689540544737066829483751462249}, + {0.689540544737066940506053924764, 0.724247082951466891742597908888}, + {0.653172842953776755514638807654, 0.757208846506484456462260368426}, + {0.615231590580626819253495796147, 0.788346427626606227612171551300}, + {0.575808191417845338655467912758, 0.817584813151583711388070696557}, + {0.534997619887097264346209612995, 0.844853565249707005868629039469}, + {0.492898192229784093409961087673, 0.870086991108711349518500810518}, + {0.449611329654606595163102156221, 0.893224301195515324458540362684}, + {0.405241314004989860997341111215, 0.914209755703530690951197357208}, + {0.359895036534988277399094158682, 0.932992798834738845670244700159}, + {0.313681740398891573118334008541, 0.949528180593036674750351266994}, + {0.266712757474898420895215167548, 0.963776065795439840222513794288}, + {0.219101240156869769837300054860, 0.975702130038528570032951847679}, + {0.170961888760301355949522417177, 0.985277642388941221618381405278}, + {0.122410675199216278929981172041, 0.992479534598709967063712156232}, + {0.073564563599667454063535387832, 0.997290456678690206970827603072}, + {0.024541228522912263837474355910, 0.999698818696204249967252053466}, + {-0.024541228522912142406831037533, 0.999698818696204249967252053466}, + {-0.073564563599667329163445117501, 0.997290456678690206970827603072}, + {-0.122410675199216154029890901711, 0.992479534598709967063712156232}, + {-0.170961888760301244927219954661, 0.985277642388941221618381405278}, + {-0.219101240156869658814997592344, 0.975702130038528570032951847679}, + {-0.266712757474898309872912705032, 0.963776065795439840222513794288}, + {-0.313681740398891406584880314767, 0.949528180593036674750351266994}, + {-0.359895036534988166376791696166, 0.932992798834738845670244700159}, + {-0.405241314004989749975038648699, 0.914209755703530690951197357208}, + {-0.449611329654606706185404618736, 0.893224301195515213436237900169}, + {-0.492898192229783982387658625157, 0.870086991108711460540803273034}, + {-0.534997619887097042301604687964, 0.844853565249707227913233964500}, + {-0.575808191417845338655467912758, 0.817584813151583711388070696557}, + {-0.615231590580626708231193333631, 0.788346427626606338634474013816}, + {-0.653172842953776533470033882622, 0.757208846506484678506865293457}, + {-0.689540544737066940506053924764, 0.724247082951466891742597908888}, + {-0.724247082951466780720295446372, 0.689540544737067051528356387280}, + {-0.757208846506484567484562830941, 0.653172842953776644492336345138}, + {-0.788346427626606227612171551300, 0.615231590580626930275798258663}, + {-0.817584813151583600365768234042, 0.575808191417845449677770375274}, + {-0.844853565249707116890931501985, 0.534997619887097153323907150479}, + {-0.870086991108711349518500810518, 0.492898192229784148921112318931}, + {-0.893224301195515213436237900169, 0.449611329654606872718858312510}, + {-0.914209755703530690951197357208, 0.405241314004989916508492342473}, + {-0.932992798834738845670244700159, 0.359895036534988332910245389940}, + {-0.949528180593036674750351266994, 0.313681740398891406584880314767}, + {-0.963776065795439840222513794288, 0.266712757474898476406366398805}, + {-0.975702130038528459010649385164, 0.219101240156870047393056211149}, + {-0.985277642388941221618381405278, 0.170961888760301217171644339032}, + {-0.992479534598709967063712156232, 0.122410675199216348318920211113}, + {-0.997290456678690206970827603072, 0.073564563599667731619291544121}, + {-0.999698818696204249967252053466, 0.024541228522912326287519491075}}; +__constant__ double2 negTwids8[128] = { + {0.999924701839144502990563978528, 0.012271538285719925387429185548}, + {0.999322384588349543754759451986, 0.036807222941358831713731802893}, + {0.998118112900149179189668302570, 0.061320736302208578294425933564}, + {0.996312612182778001290728298045, 0.085797312344439893849745715215}, + {0.993906970002356060511772284372, 0.110222207293883059375794175594}, + {0.990902635427780009713671915961, 0.134580708507126167727818710773}, + {0.987301418157858434732077057561, 0.158858143333861445700705417039}, + {0.983105487431216285010293631785, 0.183039887955140950781540709613}, + {0.978317370719627654729322330240, 0.207111376192218560321478548758}, + {0.972939952205560176778931236186, 0.231058108280671109513448868711}, + {0.966976471044852070590991388599, 0.254865659604514571690003776894}, + {0.960430519415565786545130322338, 0.278519689385053059726971014243}, + {0.953306040354193862107479162660, 0.302005949319228084171129466995}, + {0.945607325380521279711842908000, 0.325310292162262926218829761638}, + {0.937339011912574959772825877735, 0.348418680249434564721866536274}, + {0.928506080473215589243807244202, 0.371317193951837543064442570540}, + {0.919113851690057770404962411703, 0.393992040061048098831264496766}, + {0.909167983090522380251741196844, 0.416429560097637152527028092663}, + {0.898674465693953816725070282700, 0.438616238538527658530341568621}, + {0.887639620402853934955089698633, 0.460538710958240005144403994564}, + {0.876070094195406601222941844753, 0.482183772079122718867694175060}, + {0.863972856121586807454093559500, 0.503538383725717575423175276228}, + {0.851355193105265195541164757742, 0.524589682678468949283967504016}, + {0.838224705554838078747081908659, 0.545324988422046463831804885558}, + {0.824589302785025290987164225953, 0.565731810783613120463542145444}, + {0.810457198252594768206336084404, 0.585797857456438864076631034550}, + {0.795836904608883566325516767392, 0.605511041404325545123299434636}, + {0.780737228572094488221466690447, 0.624859488142386343412226779037}, + {0.765167265622458958596041611600, 0.643831542889791386130582395708}, + {0.749136394523459370198281703779, 0.662415777590171783728578702721}, + {0.732654271672412815696873167326, 0.680600997795453022121137109934}, + {0.715730825283818594684248637350, 0.698376249408972915588833529910}, + {0.698376249408972915588833529910, 0.715730825283818594684248637350}, + {0.680600997795453133143439572450, 0.732654271672412815696873167326}, + {0.662415777590171783728578702721, 0.749136394523459259175979241263}, + {0.643831542889791497152884858224, 0.765167265622458958596041611600}, + {0.624859488142386454434529241553, 0.780737228572094377199164227932}, + {0.605511041404325545123299434636, 0.795836904608883455303214304877}, + {0.585797857456438864076631034550, 0.810457198252594768206336084404}, + {0.565731810783613231485844607960, 0.824589302785025290987164225953}, + {0.545324988422046463831804885558, 0.838224705554837967724779446144}, + {0.524589682678468838261665041500, 0.851355193105265195541164757742}, + {0.503538383725717575423175276228, 0.863972856121586696431791096984}, + {0.482183772079122829889996637576, 0.876070094195406601222941844753}, + {0.460538710958240005144403994564, 0.887639620402853934955089698633}, + {0.438616238538527714041492799879, 0.898674465693953816725070282700}, + {0.416429560097637319060481786437, 0.909167983090522269229438734328}, + {0.393992040061048098831264496766, 0.919113851690057770404962411703}, + {0.371317193951837598575593801797, 0.928506080473215478221504781686}, + {0.348418680249434509210715305016, 0.937339011912574959772825877735}, + {0.325310292162262981729980992895, 0.945607325380521279711842908000}, + {0.302005949319228195193431929511, 0.953306040354193751085176700144}, + {0.278519689385053059726971014243, 0.960430519415565786545130322338}, + {0.254865659604514627201155008152, 0.966976471044852070590991388599}, + {0.231058108280671276046902562484, 0.972939952205560065756628773670}, + {0.207111376192218560321478548758, 0.978317370719627654729322330240}, + {0.183039887955141061803843172129, 0.983105487431216285010293631785}, + {0.158858143333861390189554185781, 0.987301418157858434732077057561}, + {0.134580708507126223238969942031, 0.990902635427780009713671915961}, + {0.110222207293883184275884445924, 0.993906970002356060511772284372}, + {0.085797312344439879971957907401, 0.996312612182778001290728298045}, + {0.061320736302208647683364972636, 0.998118112900149179189668302570}, + {0.036807222941358991308291592759, 0.999322384588349543754759451986}, + {0.012271538285719944469387421293, 0.999924701839144502990563978528}, + {-0.012271538285719823038744102917, 0.999924701839144502990563978528}, + {-0.036807222941358866408201322429, 0.999322384588349543754759451986}, + {-0.061320736302208529722168606213, 0.998118112900149179189668302570}, + {-0.085797312344439755071867637071, 0.996312612182778001290728298045}, + {-0.110222207293883059375794175594, 0.993906970002356060511772284372}, + {-0.134580708507126112216667479515, 0.990902635427780009713671915961}, + {-0.158858143333861279167251723266, 0.987301418157858434732077057561}, + {-0.183039887955140923025965093984, 0.983105487431216285010293631785}, + {-0.207111376192218449299176086242, 0.978317370719627654729322330240}, + {-0.231058108280671137269024484340, 0.972939952205560176778931236186}, + {-0.254865659604514516178852545636, 0.966976471044852070590991388599}, + {-0.278519689385052948704668551727, 0.960430519415565897567432784854}, + {-0.302005949319228084171129466995, 0.953306040354193862107479162660}, + {-0.325310292162262870707678530380, 0.945607325380521390734145370516}, + {-0.348418680249434398188412842501, 0.937339011912574959772825877735}, + {-0.371317193951837487553291339282, 0.928506080473215589243807244202}, + {-0.393992040061047987808962034251, 0.919113851690057770404962411703}, + {-0.416429560097636985993574398890, 0.909167983090522491274043659359}, + {-0.438616238538527380974585412332, 0.898674465693953927747372745216}, + {-0.460538710958240060655555225821, 0.887639620402853934955089698633}, + {-0.482183772079122718867694175060, 0.876070094195406601222941844753}, + {-0.503538383725717464400872813712, 0.863972856121586807454093559500}, + {-0.524589682678468727239362578985, 0.851355193105265195541164757742}, + {-0.545324988422046241787199960527, 0.838224705554838189769384371175}, + {-0.565731810783613231485844607960, 0.824589302785025179964861763438}, + {-0.585797857456438864076631034550, 0.810457198252594768206336084404}, + {-0.605511041404325434100996972120, 0.795836904608883566325516767392}, + {-0.624859488142386232389924316522, 0.780737228572094599243769152963}, + {-0.643831542889791275108279933193, 0.765167265622459069618344074115}, + {-0.662415777590171894750881165237, 0.749136394523459259175979241263}, + {-0.680600997795453022121137109934, 0.732654271672412815696873167326}, + {-0.698376249408972804566531067394, 0.715730825283818705706551099865}, + {-0.715730825283818594684248637350, 0.698376249408972915588833529910}, + {-0.732654271672412704674570704810, 0.680600997795453244165742034966}, + {-0.749136394523459148153676778747, 0.662415777590172005773183627753}, + {-0.765167265622458958596041611600, 0.643831542889791386130582395708}, + {-0.780737228572094488221466690447, 0.624859488142386343412226779037}, + {-0.795836904608883455303214304877, 0.605511041404325656145601897151}, + {-0.810457198252594657184033621888, 0.585797857456438975098933497065}, + {-0.824589302785025068942559300922, 0.565731810783613453530449532991}, + {-0.838224705554838078747081908659, 0.545324988422046352809502423042}, + {-0.851355193105265195541164757742, 0.524589682678468949283967504016}, + {-0.863972856121586696431791096984, 0.503538383725717686445477738744}, + {-0.876070094195406490200639382238, 0.482183772079122885401147868834}, + {-0.887639620402853823932787236117, 0.460538710958240227189008919595}, + {-0.898674465693953927747372745216, 0.438616238538527547508039106106}, + {-0.909167983090522380251741196844, 0.416429560097637152527028092663}, + {-0.919113851690057770404962411703, 0.393992040061048154342415728024}, + {-0.928506080473215478221504781686, 0.371317193951837709597896264313}, + {-0.937339011912574848750523415220, 0.348418680249434786766471461306}, + {-0.945607325380521168689540445484, 0.325310292162263259285737149185}, + {-0.953306040354193862107479162660, 0.302005949319228028659978235737}, + {-0.960430519415565786545130322338, 0.278519689385053170749273476758}, + {-0.966976471044852070590991388599, 0.254865659604514682712306239409}, + {-0.972939952205560065756628773670, 0.231058108280671331558053793742}, + {-0.978317370719627543707019867725, 0.207111376192218837877234705047}, + {-0.983105487431216285010293631785, 0.183039887955140895270389478355}, + {-0.987301418157858434732077057561, 0.158858143333861473456281032668}, + {-0.990902635427780009713671915961, 0.134580708507126278750121173289}, + {-0.993906970002356060511772284372, 0.110222207293883239787035677182}, + {-0.996312612182778001290728298045, 0.085797312344440157527714063690}, + {-0.998118112900149179189668302570, 0.061320736302208488088805182770}, + {-0.999322384588349543754759451986, 0.036807222941358831713731802893}, + {-0.999924701839144502990563978528, 0.012271538285720006919432556458}}; +__constant__ double2 negTwids9[256] = { + {0.999981175282601109088886914833, 0.006135884649154475269094977108}, + {0.999830581795823403190581757372, 0.018406729905804820185410974887}, + {0.999529417501093142561785498401, 0.030674803176636625950957082409}, + {0.999077727752645361469774343277, 0.042938256934940820241930481416}, + {0.998475580573294774211490221205, 0.055195244349689934204583607880}, + {0.997723066644191636243022003327, 0.067443919563664050942364269758}, + {0.996820299291165667909808689728, 0.079682437971430125633887087133}, + {0.995767414467659817134403965611, 0.091908956497132723861831493650}, + {0.994564570734255415374036601861, 0.104121633872054586422706279336}, + {0.993211949234794500007694750821, 0.116318630911904752345265023905}, + {0.991709753669099525197339062288, 0.128498110793793168804555193674}, + {0.990058210262297122561392370699, 0.140658239332849210878606527331}, + {0.988257567730749464374184753979, 0.152797185258443435351694006386}, + {0.986308097244598669384174627339, 0.164913120489969922122241996476}, + {0.984210092386929025209951760189, 0.177004220412148749463909780388}, + {0.981963869109555242964404442318, 0.189068664149806192620317801811}, + {0.979569765685440518865334524889, 0.201104634842091900548410876581}, + {0.977028142657754394839741962642, 0.213110319916091361935883696788}, + {0.974339382785575858214599520579, 0.225083911359792832040938037608}, + {0.971503890986251783523641734064, 0.237023605994367198013250686017}, + {0.968522094274417377768315873254, 0.248927605745720148533450810646}, + {0.965394441697689398296233775909, 0.260794117915275514008044410730}, + {0.962121404269041580192833862384, 0.272621355449948976623630869653}, + {0.958703474895871599059660184139, 0.284407537211271876920193335536}, + {0.955141168305770782431807219837, 0.296150888243623788831371257402}, + {0.951435020969008338198591445689, 0.307849640041534866607975118313}, + {0.947585591017741091235393469105, 0.319502030816015691883080762636}, + {0.943593458161960385588429289783, 0.331106305759876429206656212045}, + {0.939459223602189918977956040180, 0.342660717311994378331263533255}, + {0.935183509938947610251602782228, 0.354163525420490343798007870646}, + {0.930766961078983712241097236983, 0.365612997804773853793847138149}, + {0.926210242138311379278547974536, 0.377007410216418259452098027396}, + {0.921514039342042012847855403379, 0.388345046698826246167612907811}, + {0.916679059921042704850435711705, 0.399624199845646788098463275674}, + {0.911706032005429878317670500110, 0.410843171057903910892150634027}, + {0.906595704514915334826241632982, 0.422000270799799681586961241919}, + {0.901348847046022028095535461034, 0.433093818853151957259939308642}, + {0.895966249756185217911763629672, 0.444122144570429200349792608904}, + {0.890448723244757878170219100866, 0.455083587126343835915776026013}, + {0.884797098430937789537154003483, 0.465976495767966181205110842711}, + {0.879012226428633525188161002006, 0.476799230063322088124522224462}, + {0.873094978418290090793618674070, 0.487550160148435995921545327292}, + {0.867046245515692648453409674403, 0.498227666972781868537367699901}, + {0.860866938637767309394632775366, 0.508830142543106989094781056338}, + {0.854557988365400533758986512112, 0.519355990165589642693078076263}, + {0.848120344803297232516570147709, 0.529803624686294605261593915202}, + {0.841554977436898443698964911164, 0.540171472729892854225397513801}, + {0.834862874986380010255970773869, 0.550457972936604811309280194109}, + {0.828045045257755796264120817796, 0.560661576197336031235352038493}, + {0.821102514991104648345299210632, 0.570780745886967255664501408319}, + {0.814036329705948413781868566730, 0.580813958095764526490256685065}, + {0.806847553543799334008213008929, 0.590759701858874164415169616404}, + {0.799537269107905013143522410246, 0.600616479383868973052074125007}, + {0.792106577300212388870193080948, 0.610382806276309475279617799970}, + {0.784556597155575241586689116957, 0.620057211763289095607376566477}, + {0.776888465673232442298967725947, 0.629638238914926984257647291088}, + {0.769103337645579698822473346809, 0.639124444863775731384691880521}, + {0.761202385484261778714198953821, 0.648514401022112441097533519496}, + {0.753186799043612520421220324351, 0.657806693297078637350239205261}, + {0.745057785441466058351522860903, 0.666999922303637471365789224365}, + {0.736816568877369904022600621829, 0.676092703575315923103516979609}, + {0.728464390448225196372789014276, 0.685083667772700355413917350234}, + {0.720002507961381654766341853247, 0.693971460889654001569226693391}, + {0.711432195745216433557800428389, 0.702754744457225299925084982533}, + {0.702754744457225299925084982533, 0.711432195745216433557800428389}, + {0.693971460889654001569226693391, 0.720002507961381654766341853247}, + {0.685083667772700355413917350234, 0.728464390448225196372789014276}, + {0.676092703575316034125819442124, 0.736816568877369793000298159313}, + {0.666999922303637471365789224365, 0.745057785441465947329220398387}, + {0.657806693297078637350239205261, 0.753186799043612409398917861836}, + {0.648514401022112552119835982012, 0.761202385484261778714198953821}, + {0.639124444863775731384691880521, 0.769103337645579587800170884293}, + {0.629638238914927095279949753603, 0.776888465673232442298967725947}, + {0.620057211763289206629679028993, 0.784556597155575241586689116957}, + {0.610382806276309475279617799970, 0.792106577300212388870193080948}, + {0.600616479383868973052074125007, 0.799537269107905013143522410246}, + {0.590759701858874275437472078920, 0.806847553543799222985910546413}, + {0.580813958095764526490256685065, 0.814036329705948302759566104214}, + {0.570780745886967366686803870834, 0.821102514991104648345299210632}, + {0.560661576197336031235352038493, 0.828045045257755796264120817796}, + {0.550457972936604811309280194109, 0.834862874986380010255970773869}, + {0.540171472729892965247699976317, 0.841554977436898332676662448648}, + {0.529803624686294827306198840233, 0.848120344803297121494267685193}, + {0.519355990165589531670775613748, 0.854557988365400533758986512112}, + {0.508830142543106989094781056338, 0.860866938637767309394632775366}, + {0.498227666972781868537367699901, 0.867046245515692648453409674403}, + {0.487550160148436051432696558550, 0.873094978418290090793618674070}, + {0.476799230063322254657975918235, 0.879012226428633414165858539491}, + {0.465976495767966125693959611453, 0.884797098430937789537154003483}, + {0.455083587126343835915776026013, 0.890448723244757878170219100866}, + {0.444122144570429255860943840162, 0.895966249756185106889461167157}, + {0.433093818853152012771090539900, 0.901348847046022028095535461034}, + {0.422000270799799792609263704435, 0.906595704514915334826241632982}, + {0.410843171057903910892150634027, 0.911706032005429878317670500110}, + {0.399624199845646788098463275674, 0.916679059921042704850435711705}, + {0.388345046698826301678764139069, 0.921514039342041901825552940863}, + {0.377007410216418314963249258653, 0.926210242138311268256245512021}, + {0.365612997804773964816149600665, 0.930766961078983712241097236983}, + {0.354163525420490510331461564419, 0.935183509938947499229300319712}, + {0.342660717311994378331263533255, 0.939459223602189918977956040180}, + {0.331106305759876429206656212045, 0.943593458161960385588429289783}, + {0.319502030816015747394231993894, 0.947585591017741091235393469105}, + {0.307849640041534977630277580829, 0.951435020969008338198591445689}, + {0.296150888243623955364824951175, 0.955141168305770671409504757321}, + {0.284407537211271821409042104278, 0.958703474895871599059660184139}, + {0.272621355449948976623630869653, 0.962121404269041580192833862384}, + {0.260794117915275569519195641988, 0.965394441697689398296233775909}, + {0.248927605745720259555753273162, 0.968522094274417266746013410739}, + {0.237023605994367336791128764162, 0.971503890986251783523641734064}, + {0.225083911359792776529786806350, 0.974339382785575858214599520579}, + {0.213110319916091361935883696788, 0.977028142657754394839741962642}, + {0.201104634842091956059562107839, 0.979569765685440518865334524889}, + {0.189068664149806275887044648698, 0.981963869109555242964404442318}, + {0.177004220412148860486212242904, 0.984210092386929025209951760189}, + {0.164913120489970088655695690250, 0.986308097244598669384174627339}, + {0.152797185258443407596118390757, 0.988257567730749464374184753979}, + {0.140658239332849238634182142960, 0.990058210262297122561392370699}, + {0.128498110793793224315706424932, 0.991709753669099525197339062288}, + {0.116318630911904877245355294235, 0.993211949234794500007694750821}, + {0.104121633872054725200584357481, 0.994564570734255415374036601861}, + {0.091908956497132696106255878021, 0.995767414467659817134403965611}, + {0.079682437971430125633887087133, 0.996820299291165667909808689728}, + {0.067443919563664106453515501016, 0.997723066644191636243022003327}, + {0.055195244349690031349098262581, 0.998475580573294774211490221205}, + {0.042938256934940959019808559560, 0.999077727752645361469774343277}, + {0.030674803176636580848146707012, 0.999529417501093142561785498401}, + {0.018406729905804820185410974887, 0.999830581795823403190581757372}, + {0.006135884649154515167734924574, 0.999981175282601109088886914833}, + {-0.006135884649154392869729868210, 0.999981175282601109088886914833}, + {-0.018406729905804695285320704556, 0.999830581795823403190581757372}, + {-0.030674803176636459417503388636, 0.999529417501093142561785498401}, + {-0.042938256934940834119718289230, 0.999077727752645361469774343277}, + {-0.055195244349689913387901896158, 0.998475580573294774211490221205}, + {-0.067443919563663981553425230686, 0.997723066644191636243022003327}, + {-0.079682437971430014611584624618, 0.996820299291165778932111152244}, + {-0.091908956497132571206165607691, 0.995767414467659817134403965611}, + {-0.104121633872054600300494087151, 0.994564570734255415374036601861}, + {-0.116318630911904752345265023905, 0.993211949234794500007694750821}, + {-0.128498110793793113293403962416, 0.991709753669099525197339062288}, + {-0.140658239332849127611879680444, 0.990058210262297122561392370699}, + {-0.152797185258443296573815928241, 0.988257567730749464374184753979}, + {-0.164913120489969949877817612105, 0.986308097244598669384174627339}, + {-0.177004220412148749463909780388, 0.984210092386929025209951760189}, + {-0.189068664149806164864742186182, 0.981963869109555242964404442318}, + {-0.201104634842091817281684029695, 0.979569765685440518865334524889}, + {-0.213110319916091250913581234272, 0.977028142657754394839741962642}, + {-0.225083911359792665507484343834, 0.974339382785575858214599520579}, + {-0.237023605994367225768826301646, 0.971503890986251783523641734064}, + {-0.248927605745720120777875195017, 0.968522094274417377768315873254}, + {-0.260794117915275458496893179472, 0.965394441697689398296233775909}, + {-0.272621355449948865601328407138, 0.962121404269041580192833862384}, + {-0.284407537211271710386739641763, 0.958703474895871599059660184139}, + {-0.296150888243623844342522488660, 0.955141168305770671409504757321}, + {-0.307849640041534866607975118313, 0.951435020969008338198591445689}, + {-0.319502030816015636371929531379, 0.947585591017741202257695931621}, + {-0.331106305759876318184353749530, 0.943593458161960385588429289783}, + {-0.342660717311994267308961070739, 0.939459223602189918977956040180}, + {-0.354163525420490399309159101904, 0.935183509938947610251602782228}, + {-0.365612997804773853793847138149, 0.930766961078983712241097236983}, + {-0.377007410216418203940946796138, 0.926210242138311379278547974536}, + {-0.388345046698826190656461676554, 0.921514039342042012847855403379}, + {-0.399624199845646677076160813158, 0.916679059921042704850435711705}, + {-0.410843171057903799869848171511, 0.911706032005429878317670500110}, + {-0.422000270799799681586961241919, 0.906595704514915334826241632982}, + {-0.433093818853151901748788077384, 0.901348847046022028095535461034}, + {-0.444122144570429144838641377646, 0.895966249756185217911763629672}, + {-0.455083587126343724893473563498, 0.890448723244757989192521563382}, + {-0.465976495767966014671657148938, 0.884797098430937900559456465999}, + {-0.476799230063321921591068530688, 0.879012226428633525188161002006}, + {-0.487550160148435718365789171003, 0.873094978418290201815921136586}, + {-0.498227666972781590981611543612, 0.867046245515692759475712136918}, + {-0.508830142543107100117083518853, 0.860866938637767198372330312850}, + {-0.519355990165589642693078076263, 0.854557988365400533758986512112}, + {-0.529803624686294716283896377718, 0.848120344803297232516570147709}, + {-0.540171472729892854225397513801, 0.841554977436898443698964911164}, + {-0.550457972936604700286977731594, 0.834862874986380121278273236385}, + {-0.560661576197335920213049575977, 0.828045045257755796264120817796}, + {-0.570780745886967144642198945803, 0.821102514991104759367601673148}, + {-0.580813958095764415467954222549, 0.814036329705948524804171029245}, + {-0.590759701858874053392867153889, 0.806847553543799445030515471444}, + {-0.600616479383868751007469199976, 0.799537269107905235188127335277}, + {-0.610382806276309586301920262486, 0.792106577300212277847890618432}, + {-0.620057211763289206629679028993, 0.784556597155575130564386654441}, + {-0.629638238914927095279949753603, 0.776888465673232442298967725947}, + {-0.639124444863775731384691880521, 0.769103337645579587800170884293}, + {-0.648514401022112441097533519496, 0.761202385484261889736501416337}, + {-0.657806693297078637350239205261, 0.753186799043612520421220324351}, + {-0.666999922303637360343486761849, 0.745057785441466058351522860903}, + {-0.676092703575315812081214517093, 0.736816568877370015044903084345}, + {-0.685083667772700244391614887718, 0.728464390448225307395091476792}, + {-0.693971460889653779524621768360, 0.720002507961381765788644315762}, + {-0.702754744457225077880480057502, 0.711432195745216655602405353420}, + {-0.711432195745216544580102890905, 0.702754744457225188902782520017}, + {-0.720002507961381654766341853247, 0.693971460889654001569226693391}, + {-0.728464390448225196372789014276, 0.685083667772700355413917350234}, + {-0.736816568877369904022600621829, 0.676092703575315923103516979609}, + {-0.745057785441465947329220398387, 0.666999922303637582388091686880}, + {-0.753186799043612409398917861836, 0.657806693297078748372541667777}, + {-0.761202385484261667691896491306, 0.648514401022112552119835982012}, + {-0.769103337645579476777868421777, 0.639124444863775842406994343037}, + {-0.776888465673232331276665263431, 0.629638238914927206302252216119}, + {-0.784556597155575019542084191926, 0.620057211763289428674283954024}, + {-0.792106577300212166825588155916, 0.610382806276309697324222725001}, + {-0.799537269107905124165824872762, 0.600616479383868862029771662492}, + {-0.806847553543799334008213008929, 0.590759701858874164415169616404}, + {-0.814036329705948413781868566730, 0.580813958095764526490256685065}, + {-0.821102514991104648345299210632, 0.570780745886967255664501408319}, + {-0.828045045257755685241818355280, 0.560661576197336142257654501009}, + {-0.834862874986380010255970773869, 0.550457972936604922331582656625}, + {-0.841554977436898332676662448648, 0.540171472729892965247699976317}, + {-0.848120344803297121494267685193, 0.529803624686294827306198840233}, + {-0.854557988365400422736684049596, 0.519355990165589753715380538779}, + {-0.860866938637767087350027850334, 0.508830142543107322161688443884}, + {-0.867046245515692759475712136918, 0.498227666972781757515065237385}, + {-0.873094978418290090793618674070, 0.487550160148435884899242864776}, + {-0.879012226428633525188161002006, 0.476799230063322088124522224462}, + {-0.884797098430937789537154003483, 0.465976495767966181205110842711}, + {-0.890448723244757878170219100866, 0.455083587126343891426927257271}, + {-0.895966249756185106889461167157, 0.444122144570429311372095071420}, + {-0.901348847046021917073232998519, 0.433093818853152068282241771158}, + {-0.906595704514915334826241632982, 0.422000270799799848120414935693}, + {-0.911706032005429767295368037594, 0.410843171057904132936755559058}, + {-0.916679059921042593828133249190, 0.399624199845647065654219431963}, + {-0.921514039342041790803250478348, 0.388345046698826579234520295358}, + {-0.926210242138311379278547974536, 0.377007410216418148429795564880}, + {-0.930766961078983712241097236983, 0.365612997804773798282695906892}, + {-0.935183509938947610251602782228, 0.354163525420490399309159101904}, + {-0.939459223602189918977956040180, 0.342660717311994433842414764513}, + {-0.943593458161960385588429289783, 0.331106305759876484717807443303}, + {-0.947585591017741091235393469105, 0.319502030816015802905383225152}, + {-0.951435020969008338198591445689, 0.307849640041535033141428812087}, + {-0.955141168305770671409504757321, 0.296150888243624010875976182433}, + {-0.958703474895871488037357721623, 0.284407537211272098964798260567}, + {-0.962121404269041469170531399868, 0.272621355449949254179387025943}, + {-0.965394441697689287273931313393, 0.260794117915275847074951798277}, + {-0.968522094274417377768315873254, 0.248927605745720093022299579388}, + {-0.971503890986251783523641734064, 0.237023605994367170257675070388}, + {-0.974339382785575858214599520579, 0.225083911359792832040938037608}, + {-0.977028142657754394839741962642, 0.213110319916091417447034928045}, + {-0.979569765685440518865334524889, 0.201104634842092011570713339097}, + {-0.981963869109555242964404442318, 0.189068664149806359153771495585}, + {-0.984210092386929025209951760189, 0.177004220412148943752939089791}, + {-0.986308097244598558361872164824, 0.164913120489970144166846921507}, + {-0.988257567730749464374184753979, 0.152797185258443685151874547046}, + {-0.990058210262297011539089908183, 0.140658239332849543945513914878}, + {-0.991709753669099525197339062288, 0.128498110793793085537828346787}, + {-0.993211949234794500007694750821, 0.116318630911904710711901600462}, + {-0.994564570734255415374036601861, 0.104121633872054572544918471522}, + {-0.995767414467659817134403965611, 0.091908956497132751617407109279}, + {-0.996820299291165667909808689728, 0.079682437971430195022826126205}, + {-0.997723066644191636243022003327, 0.067443919563664175842454540089}, + {-0.998475580573294774211490221205, 0.055195244349690093799143397746}, + {-0.999077727752645361469774343277, 0.042938256934941021469853694725}, + {-0.999529417501093142561785498401, 0.030674803176636865342796767209}, + {-0.999830581795823403190581757372, 0.018406729905805101210614083129}, + {-0.999981175282601109088886914833, 0.006135884649154798795023246782}}; +__constant__ double2 negTwids10[512] = { + {0.999995293809576191179644411022, 0.003067956762965976143242574636}, + {0.999957644551963897860957786179, 0.009203754782059819436468295351}, + {0.999882347454212561110864498914, 0.015339206284988100154054180280}, + {0.999769405351215278976440004044, 0.021474080275469507872454499875}, + {0.999618822495178638298796158779, 0.027608145778965739736143802929}, + {0.999430604555461732374510575028, 0.033741171851377579904429637736}, + {0.999204758618363886313318289467, 0.039872927587739810662004202868}, + {0.998941293186856871244572175783, 0.046003182130914622993689278019}, + {0.998640218180265271108453362103, 0.052131704680283323660727745619}, + {0.998301544933892892608184865821, 0.058258264500435752442086823066}, + {0.997925286198595995479365683423, 0.064382630929857465051924236832}, + {0.997511456140303454098727797827, 0.070504573389613856004842773473}, + {0.997060070339482962253896403126, 0.076623861392031492045795459944}, + {0.996571145790554835386387821927, 0.082740264549375691638388730098}, + {0.996044700901251967017913102609, 0.088853552582524600311764118032}, + {0.995480755491926938560709459125, 0.094963495329638991648835144588}, + {0.994879330794805616378084778262, 0.101069862754827821671455012620}, + {0.994240449453187902228989969444, 0.107172424956808842733124720326}, + {0.993564135520595304029711769545, 0.113270952177564346308180631695}, + {0.992850414459865104888081077661, 0.119365214810991354665858921180}, + {0.992099313142191796544011594960, 0.125454983411546233673661276953}, + {0.991310859846115444149461382040, 0.131540028702883116107358318914}, + {0.990485084256457093410119796317, 0.137620121586486038323116076754}, + {0.989622017463200887021912421915, 0.143695033150294471102625948333}, + {0.988721691960323778580743692146, 0.149764534677321509148484324214}, + {0.987784141644572177831662429526, 0.155828397654265232707970767478}, + {0.986809401814185527257450303296, 0.161886393780111825790868351760}, + {0.985797509167567476140447979560, 0.167938294974731172626292163841}, + {0.984748501801904208008409113972, 0.173983873387463822135501345656}, + {0.983662419211730254531289574516, 0.180022901405699514709723985106}, + {0.982539302287441240757459581801, 0.186055151663446632914755696220}, + {0.981379193313754560890060929523, 0.192080397049892437344453810510}, + {0.980182135968117429491996972502, 0.198098410717953560267190482591}, + {0.978948175319062197097252919775, 0.204108966092816868087567172552}, + {0.977677357824509929429268595413, 0.210111836880469610155941495577}, + {0.976369731330021140003339041868, 0.216106797076219520059581213900}, + {0.975025345066994120202252815943, 0.222093620973203509372240205266}, + {0.973644249650811977048192602524, 0.228072083170885731018273645532}, + {0.972226497078936269247151358286, 0.234041958583543430183482314533}, + {0.970772140728950350130332935805, 0.240003022448741498706681340991}, + {0.969281235356548531711951000034, 0.245955050335794594973393145665}, + {0.967753837093475510755524737760, 0.251897818154216968089542660891}, + {0.966190003445412504134992559557, 0.257831102162158987134432663879}, + {0.964589793289812758025902894587, 0.263754678974831346938145770764}, + {0.962953266873683877413725440420, 0.269668325572915090759806844289}, + {0.961280485811320639655264130852, 0.275571819310958143756096205834}, + {0.959571513081984517334888096229, 0.281464937925757940906379417356}, + {0.957826413027532908017747104168, 0.287347459544729511016214473784}, + {0.956045251349996405565434542950, 0.293219162694258628221177787054}, + {0.954228095109105667326332422817, 0.299079826308040475080218811854}, + {0.952375012719765878799194069870, 0.304929229735402373968611300370}, + {0.950486073949481702349828537990, 0.310767152749611474948920886163}, + {0.948561349915730267490232563432, 0.316593375556165845807754521957}, + {0.946600913083283534987799612281, 0.322407678801069852436711471455}, + {0.944604837261480256849210945802, 0.328209843579092497289906305014}, + {0.942573197601446866045193928585, 0.333999651442009382051878674247}, + {0.940506070593268295176869742136, 0.339776884406826851225957852876}, + {0.938403534063108057949875728809, 0.345541324963989093799199281420}, + {0.936265667170278259590077141183, 0.351292756085567092760868490586}, + {0.934092550404258981089355984295, 0.357030961233429977585984715915}, + {0.931884265581668147504501575895, 0.362755724367397225371689728490}, + {0.929640895843181325197690512141, 0.368466829953372321249105425522}, + {0.927362525650401114951648651186, 0.374164062971457933581831412084}, + {0.925049240782677584249427127361, 0.379847208924051160661150561282}, + {0.922701128333878628495767770801, 0.385516053843918848897942552867}, + {0.920318276709110594246965320053, 0.391170384302253870689725090415}, + {0.917900775621390496716855977866, 0.396809987416710308050227240528}, + {0.915448716088267833157487984863, 0.402434650859418430179914594191}, + {0.912962190428398212560523461434, 0.408044162864978687821349012665}, + {0.910441292258067247367137042602, 0.413638312238434502354778032895}, + {0.907886116487666261498645781103, 0.419216888363223905145105163683}, + {0.905296759318118815507148156030, 0.424779681209108805894913984957}, + {0.902673318237258826002289424650, 0.430326481340082611648512056490}, + {0.900015892016160279354153317399, 0.435857079922255474802028629711}, + {0.897324580705418317627675151016, 0.441371268731716670519205081291}, + {0.894599485631382695949298522464, 0.446868840162374159064029299770}, + {0.891840709392342723127455883514, 0.452349587233770888961004175144}, + {0.889048355854664573705292696104, 0.457813303598877174849235416332}, + {0.886222530148880638378727780946, 0.463259783551860149231060859165}, + {0.883363338665731578913664634456, 0.468688822035827901135718320802}, + {0.880470889052160754495446326473, 0.474100214650549967032588938309}, + {0.877545290207261352577461366309, 0.479493757660153008259840134997}, + {0.874586652278176113206598074612, 0.484869248000791064345804670666}, + {0.871595086655950979093177011237, 0.490226483288291159379213013381}, + {0.868570705971340895068522058864, 0.495565261825772540582590863778}, + {0.865513624090569089197799712565, 0.500885382611240714822997688316}, + {0.862423956111040612704243812914, 0.506186645345155228348232867575}, + {0.859301818357008473370228784916, 0.511468850437970301570089759480}, + {0.856147328375194471838938170549, 0.516731799017649873206892152666}, + {0.852960604930363630593603829766, 0.521975292937154389250054009608}, + {0.849741768000852548681223197491, 0.527199134781901279644955593540}, + {0.846490938774052126269964446692, 0.532403127877197901440808891493}, + {0.843208239641845436196376795124, 0.537587076295645394097277858236}, + {0.839893794195999521257078868075, 0.542750784864515889438507656450}, + {0.836547727223512005423344817245, 0.547894059173100189674698867748}, + {0.833170164701913185112402970844, 0.553016705580027467803461149742}, + {0.829761233794523045403934702335, 0.558118531220556102212526639050}, + {0.826321062845663534268680905370, 0.563199344013834091171588625002}, + {0.822849781375826427876063462463, 0.568258952670131489703919669410}, + {0.819347520076796898003124169918, 0.573297166698042204302510072012}, + {0.815814410806733780745503281651, 0.578313796411655589579936531663}, + {0.812250586585203881995198571531, 0.583308652937698290941170853330}, + {0.808656181588174982621808339900, 0.588281548222645223056304075726}, + {0.805031331142963657576672176219, 0.593232295039799795155488482123}, + {0.801376171723140240388261190674, 0.598160706996342272923072869162}, + {0.797690840943391155093422639766, 0.603066598540348164370072936435}, + {0.793975477554337172314546933194, 0.607949784967773632082810308930}, + {0.790230221437310031973311197362, 0.612810082429409708204559592559}, + {0.786455213599085767306462457782, 0.617647307937803868860271450103}, + {0.782650596166575729384362603014, 0.622461279374149967225093860179}, + {0.778816512381475978266109905235, 0.627251815495144082746037383913}, + {0.774953106594873930568212472281, 0.632018735939809062074346002191}, + {0.771060524261813817759048106382, 0.636761861236284198994894723000}, + {0.767138911935820400067598257010, 0.641481012808583161977082909289}, + {0.763188417263381269073363455391, 0.646176012983316283566637139302}, + {0.759209188978388072044367618219, 0.650846684996380875354304862412}, + {0.755201376896536547000948758068, 0.655492852999615349673945274844}, + {0.751165131909686478728360725654, 0.660114342067420478699091290764}, + {0.747100605980180132448253971233, 0.664710978203344793335816120816}, + {0.743007952135121718661991963017, 0.669282588346636009291046320868}, + {0.738887324460615113608241699694, 0.673829000378756037825667135621}, + {0.734738878095963499070819580083, 0.678350043129861468571561999852}, + {0.730562769227827590867718754453, 0.682845546385248081122654184583}, + {0.726359155084346008734996757994, 0.687315340891759052333043200633}, + {0.722128193929215345114869251120, 0.691759258364157747500655659678}, + {0.717870045055731709204849266825, 0.696177131491462986012663805013}, + {0.713584868780793635245629502606, 0.700568793943248335764906187251}, + {0.709272826438865688913892881828, 0.704934080375904881243798172363}, + {0.704934080375904992266100634879, 0.709272826438865577891590419313}, + {0.700568793943248446787208649766, 0.713584868780793524223327040090}, + {0.696177131491462986012663805013, 0.717870045055731709204849266825}, + {0.691759258364157747500655659678, 0.722128193929215345114869251120}, + {0.687315340891759163355345663149, 0.726359155084346008734996757994}, + {0.682845546385248081122654184583, 0.730562769227827590867718754453}, + {0.678350043129861579593864462367, 0.734738878095963388048517117568}, + {0.673829000378756148847969598137, 0.738887324460615113608241699694}, + {0.669282588346636009291046320868, 0.743007952135121718661991963017}, + {0.664710978203344904358118583332, 0.747100605980180132448253971233}, + {0.660114342067420478699091290764, 0.751165131909686367706058263138}, + {0.655492852999615460696247737360, 0.755201376896536547000948758068}, + {0.650846684996380986376607324928, 0.759209188978387961022065155703}, + {0.646176012983316394588939601817, 0.763188417263381269073363455391}, + {0.641481012808583161977082909289, 0.767138911935820400067598257010}, + {0.636761861236284198994894723000, 0.771060524261813706736745643866}, + {0.632018735939809062074346002191, 0.774953106594873819545910009765}, + {0.627251815495144193768339846429, 0.778816512381475867243807442719}, + {0.622461279374150078247396322695, 0.782650596166575729384362603014}, + {0.617647307937803979882573912619, 0.786455213599085767306462457782}, + {0.612810082429409708204559592559, 0.790230221437310031973311197362}, + {0.607949784967773743105112771445, 0.793975477554337172314546933194}, + {0.603066598540348275392375398951, 0.797690840943391044071120177250}, + {0.598160706996342383945375331677, 0.801376171723140129365958728158}, + {0.593232295039799795155488482123, 0.805031331142963657576672176219}, + {0.588281548222645334078606538242, 0.808656181588174982621808339900}, + {0.583308652937698290941170853330, 0.812250586585203881995198571531}, + {0.578313796411655589579936531663, 0.815814410806733780745503281651}, + {0.573297166698042315324812534527, 0.819347520076796898003124169918}, + {0.568258952670131489703919669410, 0.822849781375826316853760999948}, + {0.563199344013834091171588625002, 0.826321062845663423246378442855}, + {0.558118531220556102212526639050, 0.829761233794523045403934702335}, + {0.553016705580027578825763612258, 0.833170164701913185112402970844}, + {0.547894059173100189674698867748, 0.836547727223511894401042354730}, + {0.542750784864516000460810118966, 0.839893794195999410234776405559}, + {0.537587076295645505119580320752, 0.843208239641845436196376795124}, + {0.532403127877198012463111354009, 0.846490938774052015247661984176}, + {0.527199134781901390667258056055, 0.849741768000852437658920734975}, + {0.521975292937154389250054009608, 0.852960604930363630593603829766}, + {0.516731799017649984229194615182, 0.856147328375194471838938170549}, + {0.511468850437970523614694684511, 0.859301818357008362347926322400}, + {0.506186645345155450392837792606, 0.862423956111040501681941350398}, + {0.500885382611240936867602613347, 0.865513624090568978175497250049}, + {0.495565261825772485071439632520, 0.868570705971340895068522058864}, + {0.490226483288291103868061782123, 0.871595086655951090115479473752}, + {0.484869248000791119856955901923, 0.874586652278176113206598074612}, + {0.479493757660153008259840134997, 0.877545290207261241555158903793}, + {0.474100214650550022543740169567, 0.880470889052160754495446326473}, + {0.468688822035827956646869552060, 0.883363338665731578913664634456}, + {0.463259783551860260253363321681, 0.886222530148880638378727780946}, + {0.457813303598877285871537878847, 0.889048355854664573705292696104}, + {0.452349587233770999983306637660, 0.891840709392342723127455883514}, + {0.446868840162374325597482993544, 0.894599485631382584926996059949}, + {0.441371268731716615008053850033, 0.897324580705418317627675151016}, + {0.435857079922255474802028629711, 0.900015892016160279354153317399}, + {0.430326481340082611648512056490, 0.902673318237258826002289424650}, + {0.424779681209108805894913984957, 0.905296759318118815507148156030}, + {0.419216888363223960656256394941, 0.907886116487666150476343318587}, + {0.413638312238434557865929264153, 0.910441292258067136344834580086}, + {0.408044162864978743332500243923, 0.912962190428398101538220998918}, + {0.402434650859418541202217056707, 0.915448716088267833157487984863}, + {0.396809987416710419072529703044, 0.917900775621390385694553515350}, + {0.391170384302253981712027552931, 0.920318276709110483224662857538}, + {0.385516053843919015431396246640, 0.922701128333878517473465308285}, + {0.379847208924051105149999330024, 0.925049240782677584249427127361}, + {0.374164062971457989092982643342, 0.927362525650401114951648651186}, + {0.368466829953372321249105425522, 0.929640895843181325197690512141}, + {0.362755724367397225371689728490, 0.931884265581668147504501575895}, + {0.357030961233430033097135947173, 0.934092550404258870067053521780}, + {0.351292756085567148272019721844, 0.936265667170278259590077141183}, + {0.345541324963989149310350512678, 0.938403534063108057949875728809}, + {0.339776884406826962248260315391, 0.940506070593268295176869742136}, + {0.333999651442009493074181136762, 0.942573197601446866045193928585}, + {0.328209843579092663823359998787, 0.944604837261480256849210945802}, + {0.322407678801070018970165165229, 0.946600913083283534987799612281}, + {0.316593375556165845807754521957, 0.948561349915730267490232563432}, + {0.310767152749611474948920886163, 0.950486073949481702349828537990}, + {0.304929229735402429479762531628, 0.952375012719765878799194069870}, + {0.299079826308040475080218811854, 0.954228095109105667326332422817}, + {0.293219162694258683732329018312, 0.956045251349996405565434542950}, + {0.287347459544729566527365705042, 0.957826413027532908017747104168}, + {0.281464937925758051928681879872, 0.959571513081984517334888096229}, + {0.275571819310958254778398668350, 0.961280485811320639655264130852}, + {0.269668325572915201782109306805, 0.962953266873683877413725440420}, + {0.263754678974831513471599464538, 0.964589793289812647003600432072}, + {0.257831102162158931623281432621, 0.966190003445412615157295022073}, + {0.251897818154216912578391429633, 0.967753837093475510755524737760}, + {0.245955050335794594973393145665, 0.969281235356548531711951000034}, + {0.240003022448741498706681340991, 0.970772140728950350130332935805}, + {0.234041958583543457939057930162, 0.972226497078936269247151358286}, + {0.228072083170885786529424876790, 0.973644249650811866025890140008}, + {0.222093620973203592638967052153, 0.975025345066994120202252815943}, + {0.216106797076219603326308060787, 0.976369731330021140003339041868}, + {0.210111836880469721178243958093, 0.977677357824509929429268595413}, + {0.204108966092817006865445250696, 0.978948175319062197097252919775}, + {0.198098410717953726800644176365, 0.980182135968117318469694509986}, + {0.192080397049892381833302579253, 0.981379193313754560890060929523}, + {0.186055151663446632914755696220, 0.982539302287441240757459581801}, + {0.180022901405699514709723985106, 0.983662419211730254531289574516}, + {0.173983873387463849891076961285, 0.984748501801904208008409113972}, + {0.167938294974731228137443395099, 0.985797509167567365118145517044}, + {0.161886393780111881302019583018, 0.986809401814185416235147840780}, + {0.155828397654265315974697614365, 0.987784141644572177831662429526}, + {0.149764534677321620170786786730, 0.988721691960323778580743692146}, + {0.143695033150294582124928410849, 0.989622017463200775999609959399}, + {0.137620121586486177100994154898, 0.990485084256456982387817333802}, + {0.131540028702883282640812012687, 0.991310859846115444149461382040}, + {0.125454983411546205918085661324, 0.992099313142191796544011594960}, + {0.119365214810991354665858921180, 0.992850414459865104888081077661}, + {0.113270952177564360185968439509, 0.993564135520595304029711769545}, + {0.107172424956808870488700335954, 0.994240449453187902228989969444}, + {0.101069862754827877182606243878, 0.994879330794805616378084778262}, + {0.094963495329639061037774183660, 0.995480755491926938560709459125}, + {0.088853552582524683578490964919, 0.996044700901251967017913102609}, + {0.082740264549375802660691192614, 0.996571145790554835386387821927}, + {0.076623861392031616945885730274, 0.997060070339482962253896403126}, + {0.070504573389614008660508659432, 0.997511456140303454098727797827}, + {0.064382630929857409540773005574, 0.997925286198595995479365683423}, + {0.058258264500435731625405111345, 0.998301544933892892608184865821}, + {0.052131704680283316721833841711, 0.998640218180265271108453362103}, + {0.046003182130914643810370989740, 0.998941293186856871244572175783}, + {0.039872927587739845356473722404, 0.999204758618363886313318289467}, + {0.033741171851377642354474772901, 0.999430604555461732374510575028}, + {0.027608145778965819533423697862, 0.999618822495178638298796158779}, + {0.021474080275469605016969154576, 0.999769405351215278976440004044}, + {0.015339206284988219849974022679, 0.999882347454212561110864498914}, + {0.009203754782059959949069849472, 0.999957644551963897860957786179}, + {0.003067956762966137906206709474, 0.999995293809576191179644411022}, + {-0.003067956762966015608201653109, 0.999995293809576191179644411022}, + {-0.009203754782059836783703055119, 0.999957644551963897860957786179}, + {-0.015339206284988098419330704303, 0.999882347454212561110864498914}, + {-0.021474080275469483586325836200, 0.999769405351215278976440004044}, + {-0.027608145778965698102780379486, 0.999618822495178638298796158779}, + {-0.033741171851377517454384502571, 0.999430604555461732374510575028}, + {-0.039872927587739727395277355981, 0.999204758618363886313318289467}, + {-0.046003182130914518910280719410, 0.998941293186856871244572175783}, + {-0.052131704680283191821743571381, 0.998640218180265271108453362103}, + {-0.058258264500435606725314841015, 0.998301544933892892608184865821}, + {-0.064382630929857284640682735244, 0.997925286198595995479365683423}, + {-0.070504573389613897638206196916, 0.997511456140303454098727797827}, + {-0.076623861392031505923583267759, 0.997060070339482962253896403126}, + {-0.082740264549375677760600922284, 0.996571145790554835386387821927}, + {-0.088853552582524558678400694589, 0.996044700901251967017913102609}, + {-0.094963495329638950015471721144, 0.995480755491926938560709459125}, + {-0.101069862754827752282515973548, 0.994879330794805616378084778262}, + {-0.107172424956808759466397873439, 0.994240449453187902228989969444}, + {-0.113270952177564235285878169179, 0.993564135520595304029711769545}, + {-0.119365214810991229765768650850, 0.992850414459865104888081077661}, + {-0.125454983411546067140207583179, 0.992099313142191796544011594960}, + {-0.131540028702883143862933934543, 0.991310859846115444149461382040}, + {-0.137620121586486066078691692383, 0.990485084256456982387817333802}, + {-0.143695033150294443347050332704, 0.989622017463200887021912421915}, + {-0.149764534677321509148484324214, 0.988721691960323778580743692146}, + {-0.155828397654265204952395151849, 0.987784141644572177831662429526}, + {-0.161886393780111770279717120502, 0.986809401814185527257450303296}, + {-0.167938294974731089359565316954, 0.985797509167567476140447979560}, + {-0.173983873387463711113198883140, 0.984748501801904208008409113972}, + {-0.180022901405699403687421522591, 0.983662419211730254531289574516}, + {-0.186055151663446494136877618075, 0.982539302287441240757459581801}, + {-0.192080397049892270811000116737, 0.981379193313754560890060929523}, + {-0.198098410717953615778341713849, 0.980182135968117429491996972502}, + {-0.204108966092816895843142788181, 0.978948175319062197097252919775}, + {-0.210111836880469610155941495577, 0.977677357824509929429268595413}, + {-0.216106797076219492304005598271, 0.976369731330021140003339041868}, + {-0.222093620973203481616664589637, 0.975025345066994120202252815943}, + {-0.228072083170885675507122414274, 0.973644249650811977048192602524}, + {-0.234041958583543319161179852017, 0.972226497078936380269453820802}, + {-0.240003022448741387684378878475, 0.970772140728950350130332935805}, + {-0.245955050335794483951090683149, 0.969281235356548531711951000034}, + {-0.251897818154216801556088967118, 0.967753837093475510755524737760}, + {-0.257831102162158820600978970106, 0.966190003445412615157295022073}, + {-0.263754678974831402449297002022, 0.964589793289812758025902894587}, + {-0.269668325572915090759806844289, 0.962953266873683877413725440420}, + {-0.275571819310958143756096205834, 0.961280485811320639655264130852}, + {-0.281464937925757940906379417356, 0.959571513081984517334888096229}, + {-0.287347459544729455505063242526, 0.957826413027532908017747104168}, + {-0.293219162694258572710026555797, 0.956045251349996516587737005466}, + {-0.299079826308040364057916349338, 0.954228095109105667326332422817}, + {-0.304929229735402262946308837854, 0.952375012719765878799194069870}, + {-0.310767152749611363926618423648, 0.950486073949481813372131000506}, + {-0.316593375556165734785452059441, 0.948561349915730378512535025948}, + {-0.322407678801069852436711471455, 0.946600913083283534987799612281}, + {-0.328209843579092552801057536271, 0.944604837261480256849210945802}, + {-0.333999651442009382051878674247, 0.942573197601446866045193928585}, + {-0.339776884406826851225957852876, 0.940506070593268295176869742136}, + {-0.345541324963989038288048050163, 0.938403534063108168972178191325}, + {-0.351292756085567037249717259328, 0.936265667170278259590077141183}, + {-0.357030961233429922074833484658, 0.934092550404258981089355984295}, + {-0.362755724367397114349387265975, 0.931884265581668147504501575895}, + {-0.368466829953372210226802963007, 0.929640895843181325197690512141}, + {-0.374164062971457878070680180826, 0.927362525650401114951648651186}, + {-0.379847208924050994127696867508, 0.925049240782677695271729589876}, + {-0.385516053843918904409093784125, 0.922701128333878517473465308285}, + {-0.391170384302253870689725090415, 0.920318276709110594246965320053}, + {-0.396809987416710308050227240528, 0.917900775621390496716855977866}, + {-0.402434650859418430179914594191, 0.915448716088267833157487984863}, + {-0.408044162864978632310197781408, 0.912962190428398212560523461434}, + {-0.413638312238434446843626801638, 0.910441292258067247367137042602}, + {-0.419216888363224071678558857457, 0.907886116487666150476343318587}, + {-0.424779681209108694872611522442, 0.905296759318118815507148156030}, + {-0.430326481340082722670814519006, 0.902673318237258826002289424650}, + {-0.435857079922255363779726167195, 0.900015892016160279354153317399}, + {-0.441371268731716726030356312549, 0.897324580705418317627675151016}, + {-0.446868840162373992530575605997, 0.894599485631382806971600984980}, + {-0.452349587233770888961004175144, 0.891840709392342723127455883514}, + {-0.457813303598877008315781722558, 0.889048355854664684727595158620}, + {-0.463259783551860149231060859165, 0.886222530148880638378727780946}, + {-0.468688822035827679091113395771, 0.883363338665731689935967096972}, + {-0.474100214650549911521437707052, 0.880470889052160865517748788989}, + {-0.479493757660153119282142597513, 0.877545290207261241555158903793}, + {-0.484869248000791008834653439408, 0.874586652278176224228900537128}, + {-0.490226483288291214890364244638, 0.871595086655950979093177011237}, + {-0.495565261825772374049137170005, 0.868570705971341006090824521380}, + {-0.500885382611240825845300150831, 0.865513624090569089197799712565}, + {-0.506186645345155117325930405059, 0.862423956111040612704243812914}, + {-0.511468850437970412592392221995, 0.859301818357008362347926322400}, + {-0.516731799017649651162287227635, 0.856147328375194582861240633065}, + {-0.521975292937154278227751547092, 0.852960604930363741615906292282}, + {-0.527199134781901057600350668508, 0.849741768000852659703525660007}, + {-0.532403127877197901440808891493, 0.846490938774052126269964446692}, + {-0.537587076295645616141882783268, 0.843208239641845436196376795124}, + {-0.542750784864515778416205193935, 0.839893794195999632279381330591}, + {-0.547894059173100189674698867748, 0.836547727223512005423344817245}, + {-0.553016705580027356781158687227, 0.833170164701913296134705433360}, + {-0.558118531220556102212526639050, 0.829761233794523045403934702335}, + {-0.563199344013833980149286162487, 0.826321062845663645290983367886}, + {-0.568258952670131489703919669410, 0.822849781375826316853760999948}, + {-0.573297166698041982257905146980, 0.819347520076797120047729094949}, + {-0.578313796411655478557634069148, 0.815814410806733780745503281651}, + {-0.583308652937698401963473315845, 0.812250586585203881995198571531}, + {-0.588281548222645223056304075726, 0.808656181588175093644110802416}, + {-0.593232295039799906177790944639, 0.805031331142963546554369713704}, + {-0.598160706996342161900770406646, 0.801376171723140351410563653189}, + {-0.603066598540348275392375398951, 0.797690840943391044071120177250}, + {-0.607949784967773521060507846414, 0.793975477554337283336849395710}, + {-0.612810082429409708204559592559, 0.790230221437310031973311197362}, + {-0.617647307937803757837968987587, 0.786455213599085878328764920298}, + {-0.622461279374149967225093860179, 0.782650596166575729384362603014}, + {-0.627251815495143860701432458882, 0.778816512381476089288412367750}, + {-0.632018735939808951052043539676, 0.774953106594873930568212472281}, + {-0.636761861236284310017197185516, 0.771060524261813706736745643866}, + {-0.641481012808583050954780446773, 0.767138911935820511089900719526}, + {-0.646176012983316394588939601817, 0.763188417263381269073363455391}, + {-0.650846684996380764332002399897, 0.759209188978388183066670080734}, + {-0.655492852999615460696247737360, 0.755201376896536547000948758068}, + {-0.660114342067420367676788828248, 0.751165131909686589750663188170}, + {-0.664710978203344904358118583332, 0.747100605980180132448253971233}, + {-0.669282588346635898268743858353, 0.743007952135121829684294425533}, + {-0.673829000378756037825667135621, 0.738887324460615224630544162210}, + {-0.678350043129861246526957074821, 0.734738878095963610093122042599}, + {-0.682845546385247970100351722067, 0.730562769227827590867718754453}, + {-0.687315340891759163355345663149, 0.726359155084345897712694295478}, + {-0.691759258364157636478353197163, 0.722128193929215456137171713635}, + {-0.696177131491462986012663805013, 0.717870045055731709204849266825}, + {-0.700568793943248224742603724735, 0.713584868780793746267931965122}, + {-0.704934080375904881243798172363, 0.709272826438865577891590419313}, + {-0.709272826438865466869287956797, 0.704934080375905103288403097395}, + {-0.713584868780793635245629502606, 0.700568793943248335764906187251}, + {-0.717870045055731598182546804310, 0.696177131491463097034966267529}, + {-0.722128193929215234092566788604, 0.691759258364157858522958122194}, + {-0.726359155084345786690391832963, 0.687315340891759274377648125665}, + {-0.730562769227827479845416291937, 0.682845546385248192144956647098}, + {-0.734738878095963499070819580083, 0.678350043129861357549259537336}, + {-0.738887324460615002585939237179, 0.673829000378756148847969598137}, + {-0.743007952135121718661991963017, 0.669282588346636009291046320868}, + {-0.747100605980180021425951508718, 0.664710978203345015380421045847}, + {-0.751165131909686478728360725654, 0.660114342067420478699091290764}, + {-0.755201376896536435978646295553, 0.655492852999615571718550199876}, + {-0.759209188978388072044367618219, 0.650846684996380986376607324928}, + {-0.763188417263381047028758530359, 0.646176012983316616633544526849}, + {-0.767138911935820289045295794494, 0.641481012808583161977082909289}, + {-0.771060524261813595714443181350, 0.636761861236284421039499648032}, + {-0.774953106594873819545910009765, 0.632018735939809062074346002191}, + {-0.778816512381475978266109905235, 0.627251815495144082746037383913}, + {-0.782650596166575618362060140498, 0.622461279374150078247396322695}, + {-0.786455213599085767306462457782, 0.617647307937803868860271450103}, + {-0.790230221437309920951008734846, 0.612810082429409819226862055075}, + {-0.793975477554337172314546933194, 0.607949784967773632082810308930}, + {-0.797690840943390933048817714734, 0.603066598540348386414677861467}, + {-0.801376171723140240388261190674, 0.598160706996342383945375331677}, + {-0.805031331142963435532067251188, 0.593232295039800017200093407155}, + {-0.808656181588174982621808339900, 0.588281548222645334078606538242}, + {-0.812250586585203770972896109015, 0.583308652937698512985775778361}, + {-0.815814410806733669723200819135, 0.578313796411655700602238994179}, + {-0.819347520076797009025426632434, 0.573297166698042093280207609496}, + {-0.822849781375826205831458537432, 0.568258952670131711748524594441}, + {-0.826321062845663534268680905370, 0.563199344013834091171588625002}, + {-0.829761233794522934381632239820, 0.558118531220556324257131564082}, + {-0.833170164701913185112402970844, 0.553016705580027578825763612258}, + {-0.836547727223511894401042354730, 0.547894059173100411719303792779}, + {-0.839893794195999521257078868075, 0.542750784864515889438507656450}, + {-0.843208239641845325174074332608, 0.537587076295645727164185245783}, + {-0.846490938774052015247661984176, 0.532403127877198012463111354009}, + {-0.849741768000852548681223197491, 0.527199134781901279644955593540}, + {-0.852960604930363630593603829766, 0.521975292937154500272356472124}, + {-0.856147328375194471838938170549, 0.516731799017649762184589690150}, + {-0.859301818357008362347926322400, 0.511468850437970523614694684511}, + {-0.862423956111040501681941350398, 0.506186645345155228348232867575}, + {-0.865513624090568978175497250049, 0.500885382611240936867602613347}, + {-0.868570705971340895068522058864, 0.495565261825772540582590863778}, + {-0.871595086655950868070874548721, 0.490226483288291381423817938412}, + {-0.874586652278176113206598074612, 0.484869248000791119856955901923}, + {-0.877545290207261130532856441278, 0.479493757660153285815596291286}, + {-0.880470889052160754495446326473, 0.474100214650550078054891400825}, + {-0.883363338665731689935967096972, 0.468688822035827845624567089544}, + {-0.886222530148880527356425318430, 0.463259783551860315764514552939}, + {-0.889048355854664573705292696104, 0.457813303598877174849235416332}, + {-0.891840709392342612105153420998, 0.452349587233771055494457868917}, + {-0.894599485631382695949298522464, 0.446868840162374159064029299770}, + {-0.897324580705418206605372688500, 0.441371268731716892563810006322}, + {-0.900015892016160168331850854884, 0.435857079922255530313179860968}, + {-0.902673318237258714979986962135, 0.430326481340082889204268212779}, + {-0.905296759318118704484845693514, 0.424779681209108861406065216215}, + {-0.907886116487666039454040856072, 0.419216888363224238212012551230}, + {-0.910441292258067136344834580086, 0.413638312238434613377080495411}, + {-0.912962190428398212560523461434, 0.408044162864978576799046550150}, + {-0.915448716088267722135185522347, 0.402434650859418596713368287965}, + {-0.917900775621390496716855977866, 0.396809987416710252539076009271}, + {-0.920318276709110483224662857538, 0.391170384302254037223178784188}, + {-0.922701128333878628495767770801, 0.385516053843918848897942552867}, + {-0.925049240782677473227124664845, 0.379847208924051382705755486313}, + {-0.927362525650401114951648651186, 0.374164062971458044604133874600}, + {-0.929640895843181214175388049625, 0.368466829953372598804861581812}, + {-0.931884265581668036482199113379, 0.362755724367397280882840959748}, + {-0.934092550404258759044751059264, 0.357030961233430310652892103462}, + {-0.936265667170278259590077141183, 0.351292756085567203783170953102}, + {-0.938403534063108168972178191325, 0.345541324963988982776896818905}, + {-0.940506070593268295176869742136, 0.339776884406827017759411546649}, + {-0.942573197601446866045193928585, 0.333999651442009382051878674247}, + {-0.944604837261480145826908483286, 0.328209843579092719334511230045}, + {-0.946600913083283534987799612281, 0.322407678801069852436711471455}, + {-0.948561349915730267490232563432, 0.316593375556166067852359446988}, + {-0.950486073949481702349828537990, 0.310767152749611530460072117421}, + {-0.952375012719765767776891607355, 0.304929229735402651524367456659}, + {-0.954228095109105556304029960302, 0.299079826308040530591370043112}, + {-0.956045251349996294543132080435, 0.293219162694258961288085174601}, + {-0.957826413027532908017747104168, 0.287347459544729622038516936300}, + {-0.959571513081984517334888096229, 0.281464937925757885395228186098}, + {-0.961280485811320639655264130852, 0.275571819310958310289549899608}, + {-0.962953266873683877413725440420, 0.269668325572915090759806844289}, + {-0.964589793289812647003600432072, 0.263754678974831568982750695795}, + {-0.966190003445412504134992559557, 0.257831102162158987134432663879}, + {-0.967753837093475399733222275245, 0.251897818154217190134147585923}, + {-0.969281235356548420689648537518, 0.245955050335794650484544376923}, + {-0.970772140728950239108030473290, 0.240003022448741776262437497280}, + {-0.972226497078936269247151358286, 0.234041958583543513450209161419}, + {-0.973644249650811866025890140008, 0.228072083170886064085181033079}, + {-0.975025345066994120202252815943, 0.222093620973203648150118283411}, + {-0.976369731330021140003339041868, 0.216106797076219436792854367013}, + {-0.977677357824509929429268595413, 0.210111836880469804444970804980}, + {-0.978948175319062197097252919775, 0.204108966092816840331991556923}, + {-0.980182135968117318469694509986, 0.198098410717953810067371023251}, + {-0.981379193313754560890060929523, 0.192080397049892465100029426139}, + {-0.982539302287441240757459581801, 0.186055151663446910470511852509}, + {-0.983662419211730254531289574516, 0.180022901405699570220875216364}, + {-0.984748501801904208008409113972, 0.173983873387464127446833117574}, + {-0.985797509167567365118145517044, 0.167938294974731283648594626356}, + {-0.986809401814185527257450303296, 0.161886393780111742524141504873}, + {-0.987784141644572177831662429526, 0.155828397654265371485848845623}, + {-0.988721691960323778580743692146, 0.149764534677321453637333092956}, + {-0.989622017463200775999609959399, 0.143695033150294637636079642107}, + {-0.990485084256457093410119796317, 0.137620121586486038323116076754}, + {-0.991310859846115444149461382040, 0.131540028702883338151963243945}, + {-0.992099313142191796544011594960, 0.125454983411546261429236892582}, + {-0.992850414459865104888081077661, 0.119365214810991632221615077469}, + {-0.993564135520595304029711769545, 0.113270952177564415697119670767}, + {-0.994240449453187902228989969444, 0.107172424956809161922244300058}, + {-0.994879330794805616378084778262, 0.101069862754827932693757475135}, + {-0.995480755491926938560709459125, 0.094963495329638908382108297701}, + {-0.996044700901251967017913102609, 0.088853552582524752967430003991}, + {-0.996571145790554835386387821927, 0.082740264549375636127237498840}, + {-0.997060070339482962253896403126, 0.076623861392031686334824769347}, + {-0.997511456140303454098727797827, 0.070504573389613856004842773473}, + {-0.997925286198595995479365683423, 0.064382630929857700974316969678}, + {-0.998301544933892892608184865821, 0.058258264500435794075450246510}, + {-0.998640218180265160086150899588, 0.052131704680283594277589998001}, + {-0.998941293186856871244572175783, 0.046003182130914706260416124906}, + {-0.999204758618363886313318289467, 0.039872927587740129851123782601}, + {-0.999430604555461732374510575028, 0.033741171851377704804519908066}, + {-0.999618822495178638298796158779, 0.027608145778965659938863907996}, + {-0.999769405351215278976440004044, 0.021474080275469667467014289741}, + {-0.999882347454212561110864498914, 0.015339206284988060255414232813}, + {-0.999957644551963897860957786179, 0.009203754782060020664391508660}, + {-0.999995293809576191179644411022, 0.003067956762965977010604312625}}; +__constant__ double2 negTwids11[1024] = { + {0.999998823451701879250208548910, 0.001533980186284765500140392369}, + {0.999989411081928403213225919899, 0.004601926120448570495247153644}, + {0.999970586430974139879879203363, 0.007669828739531097012982474581}, + {0.999942349676023911619893169700, 0.010737659167264490545079524964}, + {0.999904701082852898075259417965, 0.013805388528060390587737238377}, + {0.999857641005823860602674812981, 0.016872987947281710419122902067}, + {0.999801169887884255693677459931, 0.019940428551514441379843844970}, + {0.999735288260561683060245741217, 0.023007681468839368682521850928}, + {0.999659996743959222698094890802, 0.026074717829103900845755248383}, + {0.999575296046749217637739093334, 0.029141508764193722186286450437}, + {0.999481186966166945673251120752, 0.032208025408304585823771049036}, + {0.999377670388002847801089956192, 0.035274238898213947090987119282}, + {0.999264747286594423592021030345, 0.038340120373552694088559178454}, + {0.999142418724816905317709370138, 0.041405640977076739461804066877}, + {0.999010685854073376965800434846, 0.044470771854938667688728060057}, + {0.998869549914283560987371402007, 0.047535484156959302570744085870}, + {0.998719012233872938111289840890, 0.050599749036899281662282845673}, + {0.998559074229759313645615748101, 0.053663537652730519678101472891}, + {0.998389737407340160935120820795, 0.056726821166907748228425134585}, + {0.998211003360478188461968329648, 0.059789570746639868203953227521}, + {0.998022873771486240812578216719, 0.062851757564161406244274132860}, + {0.997825350411111644532979880751, 0.065913352797003804672826277056}, + {0.997618435138519554783442799817, 0.068974327628266746126328712307}, + {0.997402129901275302792384991335, 0.072034653246889332467439714947}, + {0.997176436735326188198769159499, 0.075094300847921305330778807274}, + {0.996941357764982161171474217554, 0.078153241632794231974479259861}, + {0.996696895202896060439456960012, 0.081211446809592441331560053186}, + {0.996443051350042630076586647192, 0.084268887593324071083600301790}, + {0.996179828595696981174967277184, 0.087325535206192059223262447176}, + {0.995907229417411721250630307622, 0.090381360877864982961149564744}, + {0.995625256380994305693832302495, 0.093436335845747786610360208215}, + {0.995333912140482279795605791151, 0.096490431355252592737770100939}, + {0.995033199438118631796612589824, 0.099543618660069319026284517804}, + {0.994723121104325702646065110457, 0.102595869022436281259302859326}, + {0.994403680057679095760647669522, 0.105647153713410615893941724153}, + {0.994074879304879366337388546526, 0.108697444013138716512045789386}, + {0.993736721940724598844951742649, 0.111746711211126587004471844011}, + {0.993389211148080653046577026544, 0.114794926606510083733070359813}, + {0.993032350197851410023019980144, 0.117842061508324977281425560705}, + {0.992666142448948018994769881829, 0.120888087235777083594534531130}, + {0.992290591348257366988150351972, 0.123932975118512159196093591618}, + {0.991905700430609327256092910829, 0.126976696496885865794723713407}, + {0.991511473318743896676608073903, 0.130019222722233346312137314271}, + {0.991107913723276889861324434605, 0.133060525157139064589273402817}, + {0.990695025442664634063305584277, 0.136100575175706201003222872714}, + {0.990272812363169108174076882278, 0.139139344163826200739819682894}, + {0.989841278458820528207695588208, 0.142176803519448030632688073638}, + {0.989400427791380376874030844192, 0.145212924652847463757865398293}, + {0.988950264510302989862111644470, 0.148247678986896030961517567448}, + {0.988490792852696587011962492397, 0.151281037957330222187835033765}, + {0.988022017143283526330321819842, 0.154312973013020104939840848601}, + {0.987543941794359225738730856392, 0.157343455616238248051530490557}, + {0.987056571305750973799320036051, 0.160372457242928284637528690837}, + {0.986559910264775408172965853737, 0.163399949382973225242565717963}, + {0.986053963346195438965935409215, 0.166425903540464104057861050023}, + {0.985538735312176061853506325861, 0.169450291233967959003692271835}, + {0.985014231012239838136679281888, 0.172473083996795950589842050249}, + {0.984480455383220931508958528866, 0.175494253377271425264893878193}, + {0.983937413449218922778527485207, 0.178513770938997506920742353032}, + {0.983385110321551181300492316950, 0.181531608261124965952859611207}, + {0.982823551198705236409125518549, 0.184547736938619616475776297193}, + {0.982252741366289372493270093400, 0.187562128582529602516260069933}, + {0.981672686196983113049441271869, 0.190574754820252739717645340534}, + {0.981083391150486705534206066659, 0.193585587295803607243982469299}, + {0.980484861773469384971235740522, 0.196594597670080223350552728334}, + {0.979877103699517637558358273964, 0.199601757621130970754563804803}, + {0.979260122649082020984678820241, 0.202607038844421133427786685388}, + {0.978633924429423207591582922760, 0.205610413053099239100163231342}, + {0.977998514934557139355320032337, 0.208611851978263485030140600429}, + {0.977353900145199960824982099439, 0.211611327369227553152342125031}, + {0.976700086128711841837457541260, 0.214608810993786758292145577798}, + {0.976037079039039023875545808551, 0.217604274638483641268749124720}, + {0.975364885116656976649096577603, 0.220597690108873506487086046945}, + {0.974683510688510668096284916828, 0.223589029229789987285315078225}, + {0.973992962167955833585608615977, 0.226578263845610000659647198518}, + {0.973293246054698246716441190074, 0.229565365820518868522626121376}, + {0.972584368934732212963467645750, 0.232550307038775244672379471922}, + {0.971866337480279396388027635112, 0.235533059404975486650357652252}, + {0.971139158449725092836501971760, 0.238513594844318416177131325639}, + {0.970402838687555502339421309443, 0.241491885302869330187647278763}, + {0.969657385124292447997618182853, 0.244467902747824150644362362073}, + {0.968902804776428872024496286031, 0.247441619167773269039045658246}, + {0.968139104746362444409157888003, 0.250413006572965224361126956865}, + {0.967366292222328505445716473332, 0.253382036995570159021440304059}, + {0.966584374478333119284911845170, 0.256348682489942913953484548983}, + {0.965793358874083684995071052981, 0.259312915132886234736986352800}, + {0.964993252854920324779186557862, 0.262274707023913589143404578863}, + {0.964184063951745828902062385168, 0.265234030285511790392405373495}, + {0.963365799780954046305225801916, 0.268190857063403176319127396710}, + {0.962538468044359163400258694310, 0.271145159526808010586051977953}, + {0.961702076529122540371474769927, 0.274096909868706384294512190536}, + {0.960856633107679658500899222418, 0.277046080306099895551597001031}, + {0.960002145737665957270223771047, 0.279992643080273218014752956151}, + {0.959138622461841894306644462631, 0.282936570457055391880629713341}, + {0.958266071408017672261792085919, 0.285877834727080615273564490053}, + {0.957384500788975856266915798187, 0.288816408206049479723276363075}, + {0.956493918902395101611091376981, 0.291752263234989261952989636484}, + {0.955594334130771105861867908970, 0.294685372180514326689859672115}, + {0.954685754941338338142031716416, 0.297615707435086196408491332477}, + {0.953768189885990325116438270925, 0.300543241417273454541003729901}, + {0.952841647601198715733517019544, 0.303467946572011315620187588138}, + {0.951906136807932345966776210844, 0.306389795370860917866906447671}, + {0.950961666311575082310980633338, 0.309308760312268726799800333538}, + {0.950008245001842999144514578802, 0.312224813921824884133116029261}, + {0.949045881852700556891022642958, 0.315137928752522444852957050898}, + {0.948074585922276225069538213575, 0.318048077385014948958996683359}, + {0.947094366352777217166192258446, 0.320955232427875214451518104397}, + {0.946105232370403448349804875761, 0.323859366517852853561976189667}, + {0.945107193285260605009057144343, 0.326760452320131733472408086527}, + {0.944100258491272659178150661319, 0.329658462528587492545995019100}, + {0.943084437466093494784047379653, 0.332553369866044223890355624462}, + {0.942059739771017312648382358020, 0.335445147084531603010049138902}, + {0.941026175050889257533981435699, 0.338333766965541127280658884047}, + {0.939983753034014046789934582193, 0.341219202320282355422875752993}, + {0.938932483532064598996669246844, 0.344101425989938813909674308888}, + {0.937872376439989885454906470841, 0.346980410845923681328883958486}, + {0.936803441735921560429289911553, 0.349856129790134917634247813112}, + {0.935725689481080369347409941838, 0.352728555755210726463388937191}, + {0.934639129819680780641988349089, 0.355597661704783851721600740348}, + {0.933543772978836172704575346870, 0.358463420633736540299452144609}, + {0.932439629268462355504709648812, 0.361325805568454283545065663930}, + {0.931326709081180426075263767416, 0.364184789567079891803302871267}, + {0.930205022892219068886277000274, 0.367040345719767180376891246851}, + {0.929074581259315857018066253659, 0.369892447148934100376038713875}, + {0.927935394822617887200522091007, 0.372741067009515758545745711672}, + {0.926787474304581748718590006320, 0.375586178489217215048512343856}, + {0.925630830509872715161634459946, 0.378427754808765559602079520118}, + {0.924465474325262603905173364183, 0.381265769222162376195228716824}, + {0.923291416719527635592612568871, 0.384100195016935042069405881193}, + {0.922108668743345183393955721840, 0.386931005514388581811857648063}, + {0.920917241529189523063791966706, 0.389758174069856411225742931492}, + {0.919717146291227360954678715643, 0.392581674072951469778303135172}, + {0.918508394325212251807499796996, 0.395401478947816353848310200192}, + {0.917290997008377906318798977736, 0.398217562153373560995817115327}, + {0.916064965799331720752718410949, 0.401029897183575623209605964803}, + {0.914830312237946197129190295527, 0.403838457567654074420460119654}, + {0.913587047945250807501338385919, 0.406643216870369028637099972912}, + {0.912335184623322748009854876727, 0.409444148692257592347942818378}, + {0.911074734055176360669747737120, 0.412241226669882887545526273243}, + {0.909805708104652222090180657688, 0.415034424476081631460999687988}, + {0.908528118716306121172010534792, 0.417823715820212271410127868876}, + {0.907241977915295816359275704599, 0.420609074448402509016631256600}, + {0.905947297807268459024498952203, 0.423390474143796047279408867325}, + {0.904644090578246240497151120508, 0.426167888726799615195517390021}, + {0.903332368494511817047509794065, 0.428941292055329492782789202465}, + {0.902012143902493179759005670348, 0.431710658025057258946333149652}, + {0.900683429228646970088334455795, 0.434475960569655650367337784701}, + {0.899346236979341573380963836826, 0.437237173661044087324967222230}, + {0.898000579740739879319733063312, 0.439994271309633255828686060340}, + {0.896646470178680154994310669281, 0.442747227564570022817491690148}, + {0.895283921038557584104466968711, 0.445496016513981740736483061482}, + {0.893912945145203252650389913470, 0.448240612285219885979614673488}, + {0.892533555402764577912932963955, 0.450980989045103863865904259001}, + {0.891145764794583183920906321873, 0.453717121000163869926069537541}, + {0.889749586383072776918368163024, 0.456448982396883917722618662083}, + {0.888345033309596354698101094982, 0.459176547521944089513823428206}, + {0.886932118794342194689761527115, 0.461899790702462731406541251999}, + {0.885510856136199953070331503113, 0.464618686306237815841768679093}, + {0.884081258712634987517731133266, 0.467333208741988415102497356202}, + {0.882643339979562790986733489262, 0.470043332459595619710057690099}, + {0.881197113471222093217249948793, 0.472749031950342790686647731491}, + {0.879742592800047407131103227584, 0.475450281747155867329013290146}, + {0.878279791656541575228800411423, 0.478147056424843008848313274939}, + {0.876808723809145651451046887814, 0.480839330600333958454228877599}, + {0.875329403104110892464007065428, 0.483527078932918741305257981367}, + {0.873841843465366863163978905504, 0.486210276124486417970160800905}, + {0.872346058894391540583512778539, 0.488888896919763171755590747125}, + {0.870842063470078975306876145623, 0.491562916106549896433364210679}, + {0.869329871348606841863215777266, 0.494232308515959672945427882951}, + {0.867809496763303322985905197129, 0.496897049022654468952708839424}, + {0.866280954024512994671169963112, 0.499557112545081838383964623063}, + {0.864744257519462378169805560901, 0.502212474045710788317364858813}, + {0.863199421712124159711265747319, 0.504863108531267590350921636855}, + {0.861646461143081299205448431167, 0.507508991052970870327953889500}, + {0.860085390429390139743759391422, 0.510150096706766809084854230605}, + {0.858516224264442739944058757828, 0.512786400633562955420075013535}, + {0.856938977417828762206397641421, 0.515417878019462927241534089262}, + {0.855353664735196028701125214866, 0.518044504095999336357181164203}, + {0.853760301138111410423903180344, 0.520666254140367157354774008127}, + {0.852158901623919828871578374674, 0.523283103475656430347839886963}, + {0.850549481265603479762660299457, 0.525895027471084630654729608068}, + {0.848932055211639613467866638530, 0.528502001542228483366159252910}, + {0.847306638685858315440668775409, 0.531104001151255000756634672143}, + {0.845673246987299065402510223066, 0.533701001807152963785085830750}, + {0.844031895490066408349605353578, 0.536292979065963182350174065505}, + {0.842382599643185847604343052808, 0.538879908531008422478691954893}, + {0.840725374970458072532153437351, 0.541461765853123444536265651550}, + {0.839060237070312742169164721417, 0.544038526730883820192730127019}, + {0.837387201615661935782952696172, 0.546610166910834860409806879034}, + {0.835706284353752604232568046427, 0.549176662187719655250361938670}, + {0.834017501106018133150143967214, 0.551737988404707335732268802531}, + {0.832320867767929684077898855321, 0.554294121453620003414641814743}, + {0.830616400308846314359811913164, 0.556845037275160104073279399017}, + {0.828904114771864874988693827618, 0.559390711859136136041570352972}, + {0.827184027273669131297140211245, 0.561931121244689468774424767616}, + {0.825456154004377551380855493335, 0.564466241520519496077668009093}, + {0.823720511227391427588884198485, 0.566996048825108678315132237913}, + {0.821977115279241554723910212488, 0.569520519346947140526538078120}, + {0.820225982569434686197951123177, 0.572039629324757048500771361432}, + {0.818467129580298657920423011092, 0.574553355047715763603832783701}, + {0.816700572866827845253112627688, 0.577061672855679441695997411443}, + {0.814926329056526621563705248263, 0.579564559139405632848252025724}, + {0.813144414849253593935429762496, 0.582061990340775436969522615982}, + {0.811354847017063729452956977184, 0.584553942953015326366994486307}, + {0.809557642404051258644415156596, 0.587040393520917969105710199074}, + {0.807752817926190358477356312505, 0.589521318641063940546587218705}, + {0.805940390571176279443932344293, 0.591996694962040992393781380088}, + {0.804120377398265806512256403948, 0.594466499184664431965074982145}, + {0.802292795538115721676319935796, 0.596930708062196502261542718770}, + {0.800457662192622820818144191435, 0.599389298400564540791890522087}, + {0.798614994634760821945462794247, 0.601842247058580026575214105833}, + {0.796764810208418827741638779116, 0.604289530948155961809220571013}, + {0.794907126328237012558020069264, 0.606731127034524475583054936578}, + {0.793041960479443641673924503266, 0.609167012336453206344799582439}, + {0.791169330217690203177482999308, 0.611597163926461906413578617503}, + {0.789289253168885651668063019315, 0.614021558931038380357847472624}, + {0.787401747029031429114809270686, 0.616440174530853646217565255938}, + {0.785506829564053932202227770176, 0.618852987960976319570249870594}, + {0.783604518609638200921096995444, 0.621259976511087552708545445057}, + {0.781694832071059386713329786289, 0.623661117525694530527857750712}, + {0.779777787923014553683742633439, 0.626056388404343522324779769406}, + {0.777853404209453147544195417140, 0.628445766601832711550912335952}, + {0.775921699043407686602336070791, 0.630829229628424470455172468064}, + {0.773982690606822898438110769348, 0.633206755050057190636891846225}, + {0.772036397150384523513366730185, 0.635578320488556114398193130910}, + {0.770082836993347896736850088928, 0.637943903621844055074063817301}, + {0.768122028523365418806179150124, 0.640303482184151673273220239935}, + {0.766153990196312917326793012762, 0.642657033966226864940551877226}, + {0.764178740536116674064714970882, 0.645004536815543927374960730958}, + {0.762196298134578897887081438967, 0.647345968636512059113385930686}, + {0.760206681651202420546553639724, 0.649681307390683193681013563037}, + {0.758209909813015281443426829355, 0.652010531096959500274579113466}, + {0.756206001414394535231622285210, 0.654333617831800440356460057956}, + {0.754194975316889171246259593318, 0.656650545729428936070348754583}, + {0.752176850449042810886624010891, 0.658961292982037316612320410059}, + {0.750151645806215072731504278636, 0.661265837839992265401178883621}, + {0.748119380450403603788345208159, 0.663564158612039767248802490940}, + {0.746080073510063779274048556545, 0.665856233665509722463582420460}, + {0.744033744179929290574193601060, 0.668142041426518451530114361958}, + {0.741980411720831067867720776121, 0.670421560380173087168031997862}, + {0.739920095459516202751615310262, 0.672694769070772857766371544130}, + {0.737852814788465982687171162979, 0.674961646102011925130170766352}, + {0.735778589165713592379347574024, 0.677222170137180334847926133079}, + {0.733697438114660371866193599999, 0.679476319899364966659049969167}, + {0.731609381223892629719784963527, 0.681724074171649707665210371488}, + {0.729514438146997012957228889718, 0.683965411797315403497066199634}, + {0.727412628602375765929366480123, 0.686200311680038588235674978932}, + {0.725303972373060767964147999010, 0.688428752784090436378505728499}, + {0.723188489306527459987705697131, 0.690650714134534604582427164132}, + {0.721066199314508105011611860391, 0.692866174817424629317486051150}, + {0.718937122372804493508624545939, 0.695075113980000880431475707155}, + {0.716801278521099538565408693103, 0.697277510830886515513782342168}, + {0.714658687862769093079862159357, 0.699473344640283767326138786302}, + {0.712509370564692323668509743584, 0.701662594740168454876538817189}, + {0.710353346857062417640804596886, 0.703845240524484938582361337467}, + {0.708190637033195402594287770626, 0.706021261449339743165865002084}, + {0.706021261449339743165865002084, 0.708190637033195291571985308110}, + {0.703845240524484938582361337467, 0.710353346857062306618502134370}, + {0.701662594740168565898841279704, 0.712509370564692323668509743584}, + {0.699473344640283767326138786302, 0.714658687862768982057559696841}, + {0.697277510830886626536084804684, 0.716801278521099538565408693103}, + {0.695075113980000880431475707155, 0.718937122372804382486322083423}, + {0.692866174817424740339788513666, 0.721066199314508105011611860391}, + {0.690650714134534715604729626648, 0.723188489306527348965403234615}, + {0.688428752784090547400808191014, 0.725303972373060656941845536494}, + {0.686200311680038699257977441448, 0.727412628602375765929366480123}, + {0.683965411797315514519368662150, 0.729514438146996901934926427202}, + {0.681724074171649818687512834003, 0.731609381223892518697482501011}, + {0.679476319899365077681352431682, 0.733697438114660260843891137483}, + {0.677222170137180445870228595595, 0.735778589165713481357045111508}, + {0.674961646102012036152473228867, 0.737852814788465982687171162979}, + {0.672694769070772968788674006646, 0.739920095459516091729312847747}, + {0.670421560380173087168031997862, 0.741980411720830956845418313605}, + {0.668142041426518562552416824474, 0.744033744179929179551891138544}, + {0.665856233665509722463582420460, 0.746080073510063779274048556545}, + {0.663564158612039878271104953456, 0.748119380450403492766042745643}, + {0.661265837839992265401178883621, 0.750151645806214961709201816120}, + {0.658961292982037316612320410059, 0.752176850449042699864321548375}, + {0.656650545729429047092651217099, 0.754194975316889171246259593318}, + {0.654333617831800551378762520471, 0.756206001414394535231622285210}, + {0.652010531096959500274579113466, 0.758209909813015281443426829355}, + {0.649681307390683193681013563037, 0.760206681651202420546553639724}, + {0.647345968636512059113385930686, 0.762196298134578897887081438967}, + {0.645004536815544038397263193474, 0.764178740536116674064714970882}, + {0.642657033966226864940551877226, 0.766153990196312806304490550247}, + {0.640303482184151673273220239935, 0.768122028523365307783876687608}, + {0.637943903621844166096366279817, 0.770082836993347896736850088928}, + {0.635578320488556225420495593426, 0.772036397150384412491064267670}, + {0.633206755050057190636891846225, 0.773982690606822787415808306832}, + {0.630829229628424470455172468064, 0.775921699043407575580033608276}, + {0.628445766601832711550912335952, 0.777853404209453036521892954624}, + {0.626056388404343522324779769406, 0.779777787923014442661440170923}, + {0.623661117525694641550160213228, 0.781694832071059386713329786289}, + {0.621259976511087663730847907573, 0.783604518609638200921096995444}, + {0.618852987960976319570249870594, 0.785506829564053932202227770176}, + {0.616440174530853646217565255938, 0.787401747029031318092506808171}, + {0.614021558931038491380149935139, 0.789289253168885651668063019315}, + {0.611597163926462017435881080019, 0.791169330217690092155180536793}, + {0.609167012336453206344799582439, 0.793041960479443641673924503266}, + {0.606731127034524475583054936578, 0.794907126328237012558020069264}, + {0.604289530948156072831523033528, 0.796764810208418716719336316601}, + {0.601842247058580026575214105833, 0.798614994634760821945462794247}, + {0.599389298400564540791890522087, 0.800457662192622709795841728919}, + {0.596930708062196502261542718770, 0.802292795538115721676319935796}, + {0.594466499184664542987377444661, 0.804120377398265695489953941433}, + {0.591996694962040992393781380088, 0.805940390571176279443932344293}, + {0.589521318641063940546587218705, 0.807752817926190358477356312505}, + {0.587040393520918080128012661589, 0.809557642404051258644415156596}, + {0.584553942953015326366994486307, 0.811354847017063729452956977184}, + {0.582061990340775547991825078498, 0.813144414849253593935429762496}, + {0.579564559139405743870554488240, 0.814926329056526621563705248263}, + {0.577061672855679552718299873959, 0.816700572866827845253112627688}, + {0.574553355047715763603832783701, 0.818467129580298657920423011092}, + {0.572039629324757048500771361432, 0.820225982569434686197951123177}, + {0.569520519346947251548840540636, 0.821977115279241554723910212488}, + {0.566996048825108678315132237913, 0.823720511227391316566581735970}, + {0.564466241520519496077668009093, 0.825456154004377440358553030819}, + {0.561931121244689468774424767616, 0.827184027273669020274837748730}, + {0.559390711859136136041570352972, 0.828904114771864874988693827618}, + {0.556845037275160104073279399017, 0.830616400308846203337509450648}, + {0.554294121453620114436944277259, 0.832320867767929684077898855321}, + {0.551737988404707446754571265046, 0.834017501106018133150143967214}, + {0.549176662187719766272664401185, 0.835706284353752604232568046427}, + {0.546610166910834860409806879034, 0.837387201615661935782952696172}, + {0.544038526730883931215032589535, 0.839060237070312631146862258902}, + {0.541461765853123555558568114066, 0.840725374970458072532153437351}, + {0.538879908531008422478691954893, 0.842382599643185958626645515324}, + {0.536292979065963182350174065505, 0.844031895490066408349605353578}, + {0.533701001807152963785085830750, 0.845673246987299065402510223066}, + {0.531104001151255000756634672143, 0.847306638685858315440668775409}, + {0.528502001542228483366159252910, 0.848932055211639613467866638530}, + {0.525895027471084741677032070584, 0.850549481265603368740357836941}, + {0.523283103475656430347839886963, 0.852158901623919828871578374674}, + {0.520666254140367268377076470642, 0.853760301138111299401600717829}, + {0.518044504095999336357181164203, 0.855353664735196028701125214866}, + {0.515417878019463149286139014293, 0.856938977417828651184095178905}, + {0.512786400633563066442377476051, 0.858516224264442739944058757828}, + {0.510150096706766698062551768089, 0.860085390429390139743759391422}, + {0.507508991052970870327953889500, 0.861646461143081299205448431167}, + {0.504863108531267479328619174339, 0.863199421712124159711265747319}, + {0.502212474045710899339667321328, 0.864744257519462378169805560901}, + {0.499557112545081893895115854320, 0.866280954024512994671169963112}, + {0.496897049022654635486162533198, 0.867809496763303211963602734613}, + {0.494232308515959728456579114209, 0.869329871348606730840913314751}, + {0.491562916106550062966817904453, 0.870842063470078864284573683108}, + {0.488888896919763227266741978383, 0.872346058894391540583512778539}, + {0.486210276124486528992463263421, 0.873841843465366752141676442989}, + {0.483527078932918741305257981367, 0.875329403104110781441704602912}, + {0.480839330600333902943077646341, 0.876808723809145762473349350330}, + {0.478147056424843119870615737455, 0.878279791656541464206497948908}, + {0.475450281747155867329013290146, 0.879742592800047407131103227584}, + {0.472749031950342901708950194006, 0.881197113471221982194947486278}, + {0.470043332459595619710057690099, 0.882643339979562790986733489262}, + {0.467333208741988526124799818717, 0.884081258712634987517731133266}, + {0.464618686306237815841768679093, 0.885510856136199953070331503113}, + {0.461899790702462842428843714515, 0.886932118794342083667459064600}, + {0.459176547521944145024974659464, 0.888345033309596243675798632466}, + {0.456448982396883862211467430825, 0.889749586383072887940670625539}, + {0.453717121000163925437220768799, 0.891145764794583183920906321873}, + {0.450980989045103808354753027743, 0.892533555402764688935235426470}, + {0.448240612285219997001917136004, 0.893912945145203252650389913470}, + {0.445496016513981740736483061482, 0.895283921038557584104466968711}, + {0.442747227564570133839794152664, 0.896646470178680154994310669281}, + {0.439994271309633255828686060340, 0.898000579740739879319733063312}, + {0.437237173661044198347269684746, 0.899346236979341462358661374310}, + {0.434475960569655705878489015959, 0.900683429228646859066031993279}, + {0.431710658025057369968635612167, 0.902012143902493068736703207833}, + {0.428941292055329548293940433723, 0.903332368494511817047509794065}, + {0.426167888726799615195517390021, 0.904644090578246240497151120508}, + {0.423390474143796102790560098583, 0.905947297807268459024498952203}, + {0.420609074448402509016631256600, 0.907241977915295927381578167115}, + {0.417823715820212382432430331392, 0.908528118716306121172010534792}, + {0.415034424476081631460999687988, 0.909805708104652222090180657688}, + {0.412241226669882998567828735759, 0.911074734055176249647445274604}, + {0.409444148692257592347942818378, 0.912335184623322748009854876727}, + {0.406643216870369139659402435427, 0.913587047945250807501338385919}, + {0.403838457567654129931611350912, 0.914830312237946086106887833012}, + {0.401029897183575789743059658576, 0.916064965799331609730415948434}, + {0.398217562153373616506968346584, 0.917290997008377906318798977736}, + {0.395401478947816298337158968934, 0.918508394325212251807499796996}, + {0.392581674072951525289454366430, 0.919717146291227360954678715643}, + {0.389758174069856411225742931492, 0.920917241529189523063791966706}, + {0.386931005514388692834160110579, 0.922108668743345072371653259324}, + {0.384100195016935042069405881193, 0.923291416719527635592612568871}, + {0.381265769222162487217531179340, 0.924465474325262603905173364183}, + {0.378427754808765615113230751376, 0.925630830509872715161634459946}, + {0.375586178489217326070814806371, 0.926787474304581748718590006320}, + {0.372741067009515814056896942930, 0.927935394822617887200522091007}, + {0.369892447148934266909492407649, 0.929074581259315745995763791143}, + {0.367040345719767235888042478109, 0.930205022892219068886277000274}, + {0.364184789567079836292151640009, 0.931326709081180426075263767416}, + {0.361325805568454339056216895187, 0.932439629268462355504709648812}, + {0.358463420633736540299452144609, 0.933543772978836172704575346870}, + {0.355597661704783962743903202863, 0.934639129819680780641988349089}, + {0.352728555755210726463388937191, 0.935725689481080369347409941838}, + {0.349856129790135028656550275628, 0.936803441735921560429289911553}, + {0.346980410845923681328883958486, 0.937872376439989885454906470841}, + {0.344101425989938980443128002662, 0.938932483532064487974366784329}, + {0.341219202320282410934026984251, 0.939983753034013935767632119678}, + {0.338333766965541293814112577820, 0.941026175050889257533981435699}, + {0.335445147084531658521200370160, 0.942059739771017312648382358020}, + {0.332553369866044223890355624462, 0.943084437466093494784047379653}, + {0.329658462528587548057146250358, 0.944100258491272659178150661319}, + {0.326760452320131788983559317785, 0.945107193285260605009057144343}, + {0.323859366517852964584278652183, 0.946105232370403337327502413245}, + {0.320955232427875214451518104397, 0.947094366352777217166192258446}, + {0.318048077385015059981299145875, 0.948074585922276225069538213575}, + {0.315137928752522444852957050898, 0.949045881852700556891022642958}, + {0.312224813921825050666569723035, 0.950008245001842999144514578802}, + {0.309308760312268782310951564796, 0.950961666311575082310980633338}, + {0.306389795370861084400360141444, 0.951906136807932234944473748328}, + {0.303467946572011371131338819396, 0.952841647601198715733517019544}, + {0.300543241417273399029852498643, 0.953768189885990325116438270925}, + {0.297615707435086307430793794992, 0.954685754941338338142031716416}, + {0.294685372180514326689859672115, 0.955594334130771105861867908970}, + {0.291752263234989372975292098999, 0.956493918902394990588788914465}, + {0.288816408206049479723276363075, 0.957384500788975856266915798187}, + {0.285877834727080726295866952569, 0.958266071408017672261792085919}, + {0.282936570457055391880629713341, 0.959138622461841894306644462631}, + {0.279992643080273384548206649924, 0.960002145737665846247921308532}, + {0.277046080306099951062748232289, 0.960856633107679658500899222418}, + {0.274096909868706328783360959278, 0.961702076529122540371474769927}, + {0.271145159526808066097203209210, 0.962538468044359163400258694310}, + {0.268190857063403176319127396710, 0.963365799780954046305225801916}, + {0.265234030285511901414707836011, 0.964184063951745717879759922653}, + {0.262274707023913589143404578863, 0.964993252854920324779186557862}, + {0.259312915132886345759288815316, 0.965793358874083573972768590465}, + {0.256348682489942913953484548983, 0.966584374478333119284911845170}, + {0.253382036995570270043742766575, 0.967366292222328505445716473332}, + {0.250413006572965279872278188122, 0.968139104746362333386855425488}, + {0.247441619167773435572499352020, 0.968902804776428872024496286031}, + {0.244467902747824206155513593330, 0.969657385124292447997618182853}, + {0.241491885302869302432071663134, 0.970402838687555502339421309443}, + {0.238513594844318499443858172526, 0.971139158449725092836501971760}, + {0.235533059404975458894782036623, 0.971866337480279396388027635112}, + {0.232550307038775327939106318809, 0.972584368934732212963467645750}, + {0.229565365820518868522626121376, 0.973293246054698246716441190074}, + {0.226578263845610111681949661033, 0.973992962167955833585608615977}, + {0.223589029229790015040890693854, 0.974683510688510668096284916828}, + {0.220597690108873645264964125090, 0.975364885116656865626794115087}, + {0.217604274638483669024324740349, 0.976037079039039023875545808551}, + {0.214608810993786924825599271571, 0.976700086128711841837457541260}, + {0.211611327369227608663493356289, 0.977353900145199960824982099439}, + {0.208611851978263457274564984800, 0.977998514934557139355320032337}, + {0.205610413053099322366890078229, 0.978633924429423096569280460244}, + {0.202607038844421105672211069759, 0.979260122649082020984678820241}, + {0.199601757621131054021290651690, 0.979877103699517637558358273964}, + {0.196594597670080223350552728334, 0.980484861773469384971235740522}, + {0.193585587295803746021860547444, 0.981083391150486594511903604143}, + {0.190574754820252795228796571791, 0.981672686196983113049441271869}, + {0.187562128582529741294138148078, 0.982252741366289372493270093400}, + {0.184547736938619644231351912822, 0.982823551198705236409125518549}, + {0.181531608261125132486313304980, 0.983385110321551181300492316950}, + {0.178513770938997590187469199918, 0.983937413449218922778527485207}, + {0.175494253377271369753742646935, 0.984480455383220931508958528866}, + {0.172473083996796033856568897136, 0.985014231012239838136679281888}, + {0.169450291233967931248116656207, 0.985538735312176061853506325861}, + {0.166425903540464215080163512539, 0.986053963346195438965935409215}, + {0.163399949382973225242565717963, 0.986559910264775408172965853737}, + {0.160372457242928395659831153353, 0.987056571305750973799320036051}, + {0.157343455616238275807106106186, 0.987543941794359225738730856392}, + {0.154312973013020243717718926746, 0.988022017143283526330321819842}, + {0.151281037957330249943410649394, 0.988490792852696587011962492397}, + {0.148247678986896197494971261222, 0.988950264510302989862111644470}, + {0.145212924652847519269016629551, 0.989400427791380376874030844192}, + {0.142176803519448002877112458009, 0.989841278458820528207695588208}, + {0.139139344163826284006546529781, 0.990272812363169108174076882278}, + {0.136100575175706201003222872714, 0.990695025442664634063305584277}, + {0.133060525157139175611575865332, 0.991107913723276778839021972090}, + {0.130019222722233346312137314271, 0.991511473318743896676608073903}, + {0.126976696496885976817026175922, 0.991905700430609327256092910829}, + {0.123932975118512200829457015061, 0.992290591348257366988150351972}, + {0.120888087235777222372412609275, 0.992666142448948018994769881829}, + {0.117842061508325018914788984148, 0.993032350197851410023019980144}, + {0.114794926606510250266524053586, 0.993389211148080653046577026544}, + {0.111746711211126656393410883084, 0.993736721940724598844951742649}, + {0.108697444013138674878682365943, 0.994074879304879366337388546526}, + {0.105647153713410699160668571039, 0.994403680057679095760647669522}, + {0.102595869022436281259302859326, 0.994723121104325702646065110457}, + {0.099543618660069443926374788134, 0.995033199438118631796612589824}, + {0.096490431355252606615557908754, 0.995333912140482279795605791151}, + {0.093436335845747911510450478545, 0.995625256380994305693832302495}, + {0.090381360877865010716725180373, 0.995907229417411721250630307622}, + {0.087325535206192225756716140950, 0.996179828595696870152664814668}, + {0.084268887593324126594751533048, 0.996443051350042630076586647192}, + {0.081211446809592385820408821928, 0.996696895202896060439456960012}, + {0.078153241632794315241206106748, 0.996941357764982161171474217554}, + {0.075094300847921291452990999460, 0.997176436735326188198769159499}, + {0.072034653246889415734166561833, 0.997402129901275302792384991335}, + {0.068974327628266732248540904493, 0.997618435138519554783442799817}, + {0.065913352797003929572916547386, 0.997825350411111644532979880751}, + {0.062851757564161420122061940674, 0.998022873771486240812578216719}, + {0.059789570746640006981831305666, 0.998211003360478188461968329648}, + {0.056726821166907782922894654121, 0.998389737407340160935120820795}, + {0.053663537652730679272661262758, 0.998559074229759313645615748101}, + {0.050599749036899337173434076931, 0.998719012233872938111289840890}, + {0.047535484156959260937380662426, 0.998869549914283560987371402007}, + {0.044470771854938744016561003036, 0.999010685854073376965800434846}, + {0.041405640977076711706228451249, 0.999142418724816905317709370138}, + {0.038340120373552791233073833155, 0.999264747286594423592021030345}, + {0.035274238898213947090987119282, 0.999377670388002847801089956192}, + {0.032208025408304703784967415459, 0.999481186966166945673251120752}, + {0.029141508764193739533521210205, 0.999575296046749217637739093334}, + {0.026074717829104039623633326528, 0.999659996743959222698094890802}, + {0.023007681468839410315885274372, 0.999735288260561683060245741217}, + {0.019940428551514597504956682883, 0.999801169887884255693677459931}, + {0.016872987947281772869168037232, 0.999857641005823860602674812981}, + {0.013805388528060348954373814934, 0.999904701082852898075259417965}, + {0.010737659167264572077082895873, 0.999942349676023911619893169700}, + {0.007669828739531077063662500848, 0.999970586430974139879879203363}, + {0.004601926120448671976570498288, 0.999989411081928403213225919899}, + {0.001533980186284766150661695860, 0.999998823451701879250208548910}, + {-0.001533980186284643635816204998, 0.999998823451701879250208548910}, + {-0.004601926120448549678565441923, 0.999989411081928403213225919899}, + {-0.007669828739530954765657444483, 0.999970586430974139879879203363}, + {-0.010737659167264448911716101520, 0.999942349676023911619893169700}, + {-0.013805388528060225789007020580, 0.999904701082852898075259417965}, + {-0.016872987947281651438524718856, 0.999857641005823860602674812981}, + {-0.019940428551514476074313364506, 0.999801169887884255693677459931}, + {-0.023007681468839288885241955995, 0.999735288260561683060245741217}, + {-0.026074717829103914723543056198, 0.999659996743959222698094890802}, + {-0.029141508764193618102877891829, 0.999575296046749217637739093334}, + {-0.032208025408304578884877145128, 0.999481186966166945673251120752}, + {-0.035274238898213822190896848952, 0.999377670388002847801089956192}, + {-0.038340120373552666332983562825, 0.999264747286594423592021030345}, + {-0.041405640977076593745032084826, 0.999142418724816905317709370138}, + {-0.044470771854938619116470732706, 0.999010685854073376965800434846}, + {-0.047535484156959136037290392096, 0.998869549914283560987371402007}, + {-0.050599749036899212273343806601, 0.998719012233872938111289840890}, + {-0.053663537652730554372570992427, 0.998559074229759313645615748101}, + {-0.056726821166907658022804383791, 0.998389737407340160935120820795}, + {-0.059789570746639882081741035336, 0.998211003360478188461968329648}, + {-0.062851757564161309099759478158, 0.998022873771486240812578216719}, + {-0.065913352797003804672826277056, 0.997825350411111644532979880751}, + {-0.068974327628266607348450634163, 0.997618435138519554783442799817}, + {-0.072034653246889290834076291503, 0.997402129901275302792384991335}, + {-0.075094300847921166552900729130, 0.997176436735326188198769159499}, + {-0.078153241632794190341115836418, 0.996941357764982161171474217554}, + {-0.081211446809592260920318551598, 0.996696895202896060439456960012}, + {-0.084268887593324001694661262718, 0.996443051350042630076586647192}, + {-0.087325535206192100856625870620, 0.996179828595696870152664814668}, + {-0.090381360877864885816634910043, 0.995907229417411721250630307622}, + {-0.093436335845747786610360208215, 0.995625256380994305693832302495}, + {-0.096490431355252481715467638423, 0.995333912140482279795605791151}, + {-0.099543618660069319026284517804, 0.995033199438118631796612589824}, + {-0.102595869022436156359212588995, 0.994723121104325702646065110457}, + {-0.105647153713410574260578300709, 0.994403680057679095760647669522}, + {-0.108697444013138563856379903427, 0.994074879304879477359691009042}, + {-0.111746711211126545371108420568, 0.993736721940724598844951742649}, + {-0.114794926606510125366433783256, 0.993389211148080653046577026544}, + {-0.117842061508324894014698713818, 0.993032350197851410023019980144}, + {-0.120888087235777097472322338945, 0.992666142448948018994769881829}, + {-0.123932975118512075929366744731, 0.992290591348257366988150351972}, + {-0.126976696496885865794723713407, 0.991905700430609327256092910829}, + {-0.130019222722233235289834851756, 0.991511473318744007698910536419}, + {-0.133060525157139036833697787188, 0.991107913723276889861324434605}, + {-0.136100575175706062225344794570, 0.990695025442664634063305584277}, + {-0.139139344163826172984244067266, 0.990272812363169108174076882278}, + {-0.142176803519447891854809995493, 0.989841278458820528207695588208}, + {-0.145212924652847408246714167035, 0.989400427791380376874030844192}, + {-0.148247678986896086472668798706, 0.988950264510302989862111644470}, + {-0.151281037957330138921108186878, 0.988490792852696698034264954913}, + {-0.154312973013020132695416464230, 0.988022017143283526330321819842}, + {-0.157343455616238164784803643670, 0.987543941794359336761033318908}, + {-0.160372457242928256881953075208, 0.987056571305750973799320036051}, + {-0.163399949382973114220263255447, 0.986559910264775519195268316253}, + {-0.166425903540464104057861050023, 0.986053963346195438965935409215}, + {-0.169450291233967820225814193691, 0.985538735312176061853506325861}, + {-0.172473083996795922834266434620, 0.985014231012239838136679281888}, + {-0.175494253377271258731440184420, 0.984480455383220931508958528866}, + {-0.178513770938997451409591121774, 0.983937413449218922778527485207}, + {-0.181531608261125021464010842465, 0.983385110321551181300492316950}, + {-0.184547736938619533209049450306, 0.982823551198705347431427981064}, + {-0.187562128582529602516260069933, 0.982252741366289372493270093400}, + {-0.190574754820252656450918493647, 0.981672686196983113049441271869}, + {-0.193585587295803607243982469299, 0.981083391150486705534206066659}, + {-0.196594597670080112328250265818, 0.980484861773469384971235740522}, + {-0.199601757621130942998988189174, 0.979877103699517637558358273964}, + {-0.202607038844420966894332991615, 0.979260122649082132006981282757}, + {-0.205610413053099211344587615713, 0.978633924429423207591582922760}, + {-0.208611851978263318496686906656, 0.977998514934557139355320032337}, + {-0.211611327369227497641190893773, 0.977353900145200071847284561954}, + {-0.214608810993786813803296809056, 0.976700086128711841837457541260}, + {-0.217604274638483558002022277833, 0.976037079039039134897848271066}, + {-0.220597690108873534242661662574, 0.975364885116656976649096577603}, + {-0.223589029229789876263012615709, 0.974683510688510668096284916828}, + {-0.226578263845610000659647198518, 0.973992962167955833585608615977}, + {-0.229565365820518757500323658860, 0.973293246054698246716441190074}, + {-0.232550307038775216916803856293, 0.972584368934732212963467645750}, + {-0.235533059404975347872479574107, 0.971866337480279396388027635112}, + {-0.238513594844318388421555710011, 0.971139158449725092836501971760}, + {-0.241491885302869163654193584989, 0.970402838687555502339421309443}, + {-0.244467902747824095133211130815, 0.969657385124292447997618182853}, + {-0.247441619167773324550196889504, 0.968902804776428872024496286031}, + {-0.250413006572965168849975725607, 0.968139104746362444409157888003}, + {-0.253382036995570159021440304059, 0.967366292222328505445716473332}, + {-0.256348682489942802931182086468, 0.966584374478333119284911845170}, + {-0.259312915132886234736986352800, 0.965793358874083684995071052981}, + {-0.262274707023913478121102116347, 0.964993252854920435801489020378}, + {-0.265234030285511790392405373495, 0.964184063951745828902062385168}, + {-0.268190857063403009785673702936, 0.963365799780954046305225801916}, + {-0.271145159526807955074900746695, 0.962538468044359163400258694310}, + {-0.274096909868706217761058496762, 0.961702076529122540371474769927}, + {-0.277046080306099840040445769773, 0.960856633107679658500899222418}, + {-0.279992643080273273525904187409, 0.960002145737665846247921308532}, + {-0.282936570457055280858327250826, 0.959138622461842005328946925147}, + {-0.285877834727080615273564490053, 0.958266071408017672261792085919}, + {-0.288816408206049368700973900559, 0.957384500788975967289218260703}, + {-0.291752263234989261952989636484, 0.956493918902395101611091376981}, + {-0.294685372180514215667557209599, 0.955594334130771105861867908970}, + {-0.297615707435086196408491332477, 0.954685754941338338142031716416}, + {-0.300543241417273288007550036127, 0.953768189885990325116438270925}, + {-0.303467946572011260109036356880, 0.952841647601198715733517019544}, + {-0.306389795370860973378057678929, 0.951906136807932345966776210844}, + {-0.309308760312268615777497871022, 0.950961666311575082310980633338}, + {-0.312224813921824939644267260519, 0.950008245001842999144514578802}, + {-0.315137928752522333830654588382, 0.949045881852700667913325105474}, + {-0.318048077385014948958996683359, 0.948074585922276225069538213575}, + {-0.320955232427875103429215641881, 0.947094366352777217166192258446}, + {-0.323859366517852853561976189667, 0.946105232370403448349804875761}, + {-0.326760452320131622450105624011, 0.945107193285260605009057144343}, + {-0.329658462528587437034843787842, 0.944100258491272659178150661319}, + {-0.332553369866044057356901930689, 0.943084437466093494784047379653}, + {-0.335445147084531547498897907644, 0.942059739771017423670684820536}, + {-0.338333766965541182791810115305, 0.941026175050889257533981435699}, + {-0.341219202320282299911724521735, 0.939983753034014046789934582193}, + {-0.344101425989938869420825540146, 0.938932483532064487974366784329}, + {-0.346980410845923570306581495970, 0.937872376439989885454906470841}, + {-0.349856129790134917634247813112, 0.936803441735921560429289911553}, + {-0.352728555755210615441086474675, 0.935725689481080369347409941838}, + {-0.355597661704783851721600740348, 0.934639129819680780641988349089}, + {-0.358463420633736429277149682093, 0.933543772978836283726877809386}, + {-0.361325805568454228033914432672, 0.932439629268462355504709648812}, + {-0.364184789567079725269849177494, 0.931326709081180537097566229932}, + {-0.367040345719767124865740015593, 0.930205022892219068886277000274}, + {-0.369892447148934155887189945133, 0.929074581259315745995763791143}, + {-0.372741067009515703034594480414, 0.927935394822617887200522091007}, + {-0.375586178489217215048512343856, 0.926787474304581748718590006320}, + {-0.378427754808765448579777057603, 0.925630830509872826183936922462}, + {-0.381265769222162376195228716824, 0.924465474325262603905173364183}, + {-0.384100195016934931047103418678, 0.923291416719527746614915031387}, + {-0.386931005514388581811857648063, 0.922108668743345183393955721840}, + {-0.389758174069856300203440468977, 0.920917241529189523063791966706}, + {-0.392581674072951414267151903914, 0.919717146291227360954678715643}, + {-0.395401478947816187314856506418, 0.918508394325212251807499796996}, + {-0.398217562153373505484665884069, 0.917290997008378017341101440252}, + {-0.401029897183575678720757196061, 0.916064965799331720752718410949}, + {-0.403838457567654018909308888396, 0.914830312237946197129190295527}, + {-0.406643216870369028637099972912, 0.913587047945250807501338385919}, + {-0.409444148692257481325640355863, 0.912335184623322859032157339243}, + {-0.412241226669882887545526273243, 0.911074734055176360669747737120}, + {-0.415034424476081520438697225472, 0.909805708104652333112483120203}, + {-0.417823715820212271410127868876, 0.908528118716306121172010534792}, + {-0.420609074448402397994328794084, 0.907241977915295927381578167115}, + {-0.423390474143795769723652711036, 0.905947297807268570046801414719}, + {-0.426167888726799670706668621278, 0.904644090578246129474848657992}, + {-0.428941292055329437271637971207, 0.903332368494511817047509794065}, + {-0.431710658025057092412879455878, 0.902012143902493290781308132864}, + {-0.434475960569655816900791478474, 0.900683429228646859066031993279}, + {-0.437237173661044087324967222230, 0.899346236979341573380963836826}, + {-0.439994271309633144806383597825, 0.898000579740739879319733063312}, + {-0.442747227564569800772886765117, 0.896646470178680266016613131796}, + {-0.445496016513981796247634292740, 0.895283921038557473082164506195}, + {-0.448240612285219885979614673488, 0.893912945145203252650389913470}, + {-0.450980989045103697332450565227, 0.892533555402764688935235426470}, + {-0.453717121000163592370313381252, 0.891145764794583405965511246904}, + {-0.456448982396883973233769893341, 0.889749586383072776918368163024}, + {-0.459176547521944034002672196948, 0.888345033309596354698101094982}, + {-0.461899790702462564873087558226, 0.886932118794342305712063989631}, + {-0.464618686306237926864071141608, 0.885510856136199842048029040598}, + {-0.467333208741988415102497356202, 0.884081258712634987517731133266}, + {-0.470043332459595508687755227584, 0.882643339979562902009035951778}, + {-0.472749031950342568642042806459, 0.881197113471222204239552411309}, + {-0.475450281747155978351315752661, 0.879742592800047407131103227584}, + {-0.478147056424843008848313274939, 0.878279791656541575228800411423}, + {-0.480839330600333791920775183826, 0.876808723809145762473349350330}, + {-0.483527078932918463749501825077, 0.875329403104111003486309527943}, + {-0.486210276124486417970160800905, 0.873841843465366863163978905504}, + {-0.488888896919763116244439515867, 0.872346058894391540583512778539}, + {-0.491562916106549785411061748164, 0.870842063470078975306876145623}, + {-0.494232308515959839478881576724, 0.869329871348606730840913314751}, + {-0.496897049022654524463860070682, 0.867809496763303211963602734613}, + {-0.499557112545081782872813391805, 0.866280954024513105693472425628}, + {-0.502212474045710566272759933781, 0.864744257519462489192108023417}, + {-0.504863108531267590350921636855, 0.863199421712124159711265747319}, + {-0.507508991052970759305651426985, 0.861646461143081299205448431167}, + {-0.510150096706766587040249305574, 0.860085390429390250766061853938}, + {-0.512786400633562733375470088504, 0.858516224264442961988663682860}, + {-0.515417878019463038263836551778, 0.856938977417828762206397641421}, + {-0.518044504095999225334878701688, 0.855353664735196028701125214866}, + {-0.520666254140366935310169083095, 0.853760301138111521446205642860}, + {-0.523283103475656541370142349479, 0.852158901623919717849275912158}, + {-0.525895027471084630654729608068, 0.850549481265603479762660299457}, + {-0.528502001542228372343856790394, 0.848932055211639724490169101045}, + {-0.531104001151254778712029747112, 0.847306638685858537485273700440}, + {-0.533701001807152963785085830750, 0.845673246987299065402510223066}, + {-0.536292979065963071327871602989, 0.844031895490066408349605353578}, + {-0.538879908531008311456389492378, 0.842382599643185958626645515324}, + {-0.541461765853123222491660726519, 0.840725374970458183554455899866}, + {-0.544038526730883931215032589535, 0.839060237070312631146862258902}, + {-0.546610166910834860409806879034, 0.837387201615661935782952696172}, + {-0.549176662187719544228059476154, 0.835706284353752715254870508943}, + {-0.551737988404707446754571265046, 0.834017501106018022127841504698}, + {-0.554294121453620114436944277259, 0.832320867767929684077898855321}, + {-0.556845037275159993050976936502, 0.830616400308846314359811913164}, + {-0.559390711859135802974662965426, 0.828904114771865097033298752649}, + {-0.561931121244689468774424767616, 0.827184027273669131297140211245}, + {-0.564466241520519385055365546577, 0.825456154004377551380855493335}, + {-0.566996048825108456270527312881, 0.823720511227391538611186661001}, + {-0.569520519346947251548840540636, 0.821977115279241443701607749972}, + {-0.572039629324757048500771361432, 0.820225982569434686197951123177}, + {-0.574553355047715763603832783701, 0.818467129580298768942725473607}, + {-0.577061672855679330673694948928, 0.816700572866827956275415090204}, + {-0.579564559139405854892856950755, 0.814926329056526510541402785748}, + {-0.582061990340775547991825078498, 0.813144414849253593935429762496}, + {-0.584553942953015215344692023791, 0.811354847017063840475259439700}, + {-0.587040393520917747061105274042, 0.809557642404051480689020081627}, + {-0.589521318641063940546587218705, 0.807752817926190358477356312505}, + {-0.591996694962040881371478917572, 0.805940390571176390466234806809}, + {-0.594466499184664320942772519629, 0.804120377398265806512256403948}, + {-0.596930708062196613283845181286, 0.802292795538115610654017473280}, + {-0.599389298400564540791890522087, 0.800457662192622820818144191435}, + {-0.601842247058579915552911643317, 0.798614994634760932967765256763}, + {-0.604289530948155850786918108497, 0.796764810208418938763941241632}, + {-0.606731127034524586605357399094, 0.794907126328236901535717606748}, + {-0.609167012336453206344799582439, 0.793041960479443641673924503266}, + {-0.611597163926461795391276154987, 0.791169330217690314199785461824}, + {-0.614021558931038158313242547592, 0.789289253168885873712667944346}, + {-0.616440174530853646217565255938, 0.787401747029031318092506808171}, + {-0.618852987960976208547947408078, 0.785506829564054043224530232692}, + {-0.621259976511087441686242982541, 0.783604518609638311943399457959}, + {-0.623661117525694641550160213228, 0.781694832071059275691027323774}, + {-0.626056388404343522324779769406, 0.779777787923014442661440170923}, + {-0.628445766601832600528609873436, 0.777853404209453147544195417140}, + {-0.630829229628424359432870005548, 0.775921699043407797624638533307}, + {-0.633206755050057301659194308741, 0.773982690606822787415808306832}, + {-0.635578320488556114398193130910, 0.772036397150384523513366730185}, + {-0.637943903621843944051761354785, 0.770082836993348007759152551444}, + {-0.640303482184151451228615314903, 0.768122028523365529828481612640}, + {-0.642657033966226864940551877226, 0.766153990196312917326793012762}, + {-0.645004536815543927374960730958, 0.764178740536116785087017433398}, + {-0.647345968636511948091083468171, 0.762196298134579008909383901482}, + {-0.649681307390683304703316025552, 0.760206681651202309524251177208}, + {-0.652010531096959500274579113466, 0.758209909813015281443426829355}, + {-0.654333617831800440356460057956, 0.756206001414394535231622285210}, + {-0.656650545729428825048046292068, 0.754194975316889282268562055833}, + {-0.658961292982037427634622872574, 0.752176850449042699864321548375}, + {-0.661265837839992154378876421106, 0.750151645806215072731504278636}, + {-0.663564158612039656226500028424, 0.748119380450403714810647670674}, + {-0.665856233665509500418977495428, 0.746080073510064001318653481576}, + {-0.668142041426518562552416824474, 0.744033744179929290574193601060}, + {-0.670421560380173087168031997862, 0.741980411720831067867720776121}, + {-0.672694769070772746744069081615, 0.739920095459516313773917772778}, + {-0.674961646102012147174775691383, 0.737852814788465871664868700464}, + {-0.677222170137180445870228595595, 0.735778589165713481357045111508}, + {-0.679476319899364966659049969167, 0.733697438114660371866193599999}, + {-0.681724074171649596642907908972, 0.731609381223892740742087426042}, + {-0.683965411797315514519368662150, 0.729514438146997012957228889718}, + {-0.686200311680038588235674978932, 0.727412628602375765929366480123}, + {-0.688428752784090325356203265983, 0.725303972373060878986450461525}, + {-0.690650714134534382537822239101, 0.723188489306527571010008159647}, + {-0.692866174817424740339788513666, 0.721066199314508105011611860391}, + {-0.695075113980000769409173244640, 0.718937122372804493508624545939}, + {-0.697277510830886404491479879653, 0.716801278521099649587711155618}, + {-0.699473344640283878348441248818, 0.714658687862768982057559696841}, + {-0.701662594740168454876538817189, 0.712509370564692323668509743584}, + {-0.703845240524484827560058874951, 0.710353346857062417640804596886}, + {-0.706021261449339632143562539568, 0.708190637033195513616590233141}, + {-0.708190637033195402594287770626, 0.706021261449339743165865002084}, + {-0.710353346857062306618502134370, 0.703845240524485049604663799983}, + {-0.712509370564692212646207281068, 0.701662594740168676921143742220}, + {-0.714658687862768871035257234325, 0.699473344640283989370743711333}, + {-0.716801278521099538565408693103, 0.697277510830886515513782342168}, + {-0.718937122372804382486322083423, 0.695075113980000991453778169671}, + {-0.721066199314507993989309397875, 0.692866174817424851362090976181}, + {-0.723188489306527459987705697131, 0.690650714134534604582427164132}, + {-0.725303972373060767964147999010, 0.688428752784090436378505728499}, + {-0.727412628602375654907064017607, 0.686200311680038699257977441448}, + {-0.729514438146996790912623964687, 0.683965411797315625541671124665}, + {-0.731609381223892629719784963527, 0.681724074171649707665210371488}, + {-0.733697438114660260843891137483, 0.679476319899365077681352431682}, + {-0.735778589165713370334742648993, 0.677222170137180556892531058111}, + {-0.737852814788465760642566237948, 0.674961646102012258197078153898}, + {-0.739920095459516202751615310262, 0.672694769070772857766371544130}, + {-0.741980411720830956845418313605, 0.670421560380173198190334460378}, + {-0.744033744179929068529588676029, 0.668142041426518673574719286989}, + {-0.746080073510063890296351019060, 0.665856233665509611441279957944}, + {-0.748119380450403603788345208159, 0.663564158612039767248802490940}, + {-0.750151645806214961709201816120, 0.661265837839992376423481346137}, + {-0.752176850449042477819716623344, 0.658961292982037538656925335090}, + {-0.754194975316889171246259593318, 0.656650545729429047092651217099}, + {-0.756206001414394424209319822694, 0.654333617831800551378762520471}, + {-0.758209909813015170421124366840, 0.652010531096959722319184038497}, + {-0.760206681651202198501948714693, 0.649681307390683415725618488068}, + {-0.762196298134578897887081438967, 0.647345968636512059113385930686}, + {-0.764178740536116674064714970882, 0.645004536815544038397263193474}, + {-0.766153990196312695282188087731, 0.642657033966227086985156802257}, + {-0.768122028523365418806179150124, 0.640303482184151562250917777419}, + {-0.770082836993347896736850088928, 0.637943903621844055074063817301}, + {-0.772036397150384412491064267670, 0.635578320488556225420495593426}, + {-0.773982690606822676393505844317, 0.633206755050057412681496771256}, + {-0.775921699043407686602336070791, 0.630829229628424470455172468064}, + {-0.777853404209453036521892954624, 0.628445766601832711550912335952}, + {-0.779777787923014331639137708407, 0.626056388404343633347082231921}, + {-0.781694832071059164668724861258, 0.623661117525694863594765138259}, + {-0.783604518609638200921096995444, 0.621259976511087552708545445057}, + {-0.785506829564053932202227770176, 0.618852987960976430592552333110}, + {-0.787401747029031207070204345655, 0.616440174530853757239867718454}, + {-0.789289253168885762690365481831, 0.614021558931038380357847472624}, + {-0.791169330217690203177482999308, 0.611597163926461906413578617503}, + {-0.793041960479443530651622040750, 0.609167012336453317367102044955}, + {-0.794907126328236790513415144233, 0.606731127034524697627659861610}, + {-0.796764810208418827741638779116, 0.604289530948155961809220571013}, + {-0.798614994634760821945462794247, 0.601842247058580137597516568349}, + {-0.800457662192622709795841728919, 0.599389298400564651814192984602}, + {-0.802292795538115499631715010764, 0.596930708062196724306147643802}, + {-0.804120377398265695489953941433, 0.594466499184664431965074982145}, + {-0.805940390571176279443932344293, 0.591996694962040992393781380088}, + {-0.807752817926190247455053849990, 0.589521318641064051568889681221}, + {-0.809557642404051369666717619111, 0.587040393520917969105710199074}, + {-0.811354847017063729452956977184, 0.584553942953015326366994486307}, + {-0.813144414849253482913127299980, 0.582061990340775659014127541013}, + {-0.814926329056526399519100323232, 0.579564559139405965915159413271}, + {-0.816700572866827845253112627688, 0.577061672855679441695997411443}, + {-0.818467129580298657920423011092, 0.574553355047715874626135246217}, + {-0.820225982569434575175648660661, 0.572039629324757270545376286464}, + {-0.821977115279241332679305287456, 0.569520519346947473593445465667}, + {-0.823720511227391427588884198485, 0.566996048825108678315132237913}, + {-0.825456154004377440358553030819, 0.564466241520519496077668009093}, + {-0.827184027273669020274837748730, 0.561931121244689579796727230132}, + {-0.828904114771864986010996290133, 0.559390711859136025019267890457}, + {-0.830616400308846314359811913164, 0.556845037275160104073279399017}, + {-0.832320867767929573055596392805, 0.554294121453620225459246739774}, + {-0.834017501106018022127841504698, 0.551737988404707668799176190078}, + {-0.835706284353752604232568046427, 0.549176662187719655250361938670}, + {-0.837387201615661824760650233657, 0.546610166910834971432109341549}, + {-0.839060237070312631146862258902, 0.544038526730884042237335052050}, + {-0.840725374970458072532153437351, 0.541461765853123333513963189034}, + {-0.842382599643185847604343052808, 0.538879908531008422478691954893}, + {-0.844031895490066408349605353578, 0.536292979065963293372476528020}, + {-0.845673246987298954380207760551, 0.533701001807153185829690755781}, + {-0.847306638685858426462971237925, 0.531104001151254889734332209628}, + {-0.848932055211639613467866638530, 0.528502001542228483366159252910}, + {-0.850549481265603368740357836941, 0.525895027471084852699334533099}, + {-0.852158901623919606826973449643, 0.523283103475656652392444811994}, + {-0.853760301138111410423903180344, 0.520666254140367157354774008127}, + {-0.855353664735195917678822752350, 0.518044504095999447379483626719}, + {-0.856938977417828651184095178905, 0.515417878019463149286139014293}, + {-0.858516224264442850966361220344, 0.512786400633562955420075013535}, + {-0.860085390429390139743759391422, 0.510150096706766809084854230605}, + {-0.861646461143081299205448431167, 0.507508991052970981350256352016}, + {-0.863199421712124048688963284803, 0.504863108531267701373224099370}, + {-0.864744257519462378169805560901, 0.502212474045710677295062396297}, + {-0.866280954024512994671169963112, 0.499557112545081949406267085578}, + {-0.867809496763303211963602734613, 0.496897049022654690997313764456}, + {-0.869329871348606619818610852235, 0.494232308515960006012335270498}, + {-0.870842063470078975306876145623, 0.491562916106549896433364210679}, + {-0.872346058894391429561210316024, 0.488888896919763282777893209641}, + {-0.873841843465366752141676442989, 0.486210276124486584503614494679}, + {-0.875329403104110892464007065428, 0.483527078932918630282955518851}, + {-0.876808723809145651451046887814, 0.480839330600333958454228877599}, + {-0.878279791656541464206497948908, 0.478147056424843175381766968712}, + {-0.879742592800047296108800765069, 0.475450281747156089373618215177}, + {-0.881197113471222093217249948793, 0.472749031950342735175496500233}, + {-0.882643339979562790986733489262, 0.470043332459595675221208921357}, + {-0.884081258712634876495428670751, 0.467333208741988581635951049975}, + {-0.885510856136199842048029040598, 0.464618686306238093397524835382}, + {-0.886932118794342194689761527115, 0.461899790702462731406541251999}, + {-0.888345033309596243675798632466, 0.459176547521944200536125890721}, + {-0.889749586383072665896065700508, 0.456448982396884139767223587114}, + {-0.891145764794583294943208784389, 0.453717121000163758903767075026}, + {-0.892533555402764577912932963955, 0.450980989045103863865904259001}, + {-0.893912945145203141628087450954, 0.448240612285220052513068367261}, + {-0.895283921038557362059862043679, 0.445496016513981962781087986514}, + {-0.896646470178680266016613131796, 0.442747227564569967306340458890}, + {-0.898000579740739768297430600796, 0.439994271309633311339837291598}, + {-0.899346236979341462358661374310, 0.437237173661044253858420916004}, + {-0.900683429228646748043729530764, 0.434475960569655983434245172248}, + {-0.902012143902493179759005670348, 0.431710658025057258946333149652}, + {-0.903332368494511817047509794065, 0.428941292055329603805091664981}, + {-0.904644090578246129474848657992, 0.426167888726799837240122315052}, + {-0.905947297807268459024498952203, 0.423390474143795936257106404810}, + {-0.907241977915295816359275704599, 0.420609074448402564527782487858}, + {-0.908528118716306121172010534792, 0.417823715820212437943581562649}, + {-0.909805708104652111067878195172, 0.415034424476081853505604613019}, + {-0.911074734055176360669747737120, 0.412241226669882832034375041985}, + {-0.912335184623322748009854876727, 0.409444148692257647859094049636}, + {-0.913587047945250807501338385919, 0.406643216870369195170553666685}, + {-0.914830312237945975084585370496, 0.403838457567654407487367507201}, + {-0.916064965799331720752718410949, 0.401029897183575623209605964803}, + {-0.917290997008377906318798977736, 0.398217562153373672018119577842}, + {-0.918508394325212140785197334480, 0.395401478947816520381763893965}, + {-0.919717146291227360954678715643, 0.392581674072951414267151903914}, + {-0.920917241529189412041489504190, 0.389758174069856466736894162750}, + {-0.922108668743345072371653259324, 0.386931005514388748345311341836}, + {-0.923291416719527524570310106355, 0.384100195016935319625162037482}, + {-0.924465474325262603905173364183, 0.381265769222162320684077485566}, + {-0.925630830509872715161634459946, 0.378427754808765670624381982634}, + {-0.926787474304581748718590006320, 0.375586178489217381581966037629}, + {-0.927935394822617776178219628491, 0.372741067009516091612653099219}, + {-0.929074581259315745995763791143, 0.369892447148934100376038713875}, + {-0.930205022892219068886277000274, 0.367040345719767291399193709367}, + {-0.931326709081180315052961304900, 0.364184789567080113847907796298}, + {-0.932439629268462466527012111328, 0.361325805568454172522763201414}, + {-0.933543772978836172704575346870, 0.358463420633736595810603375867}, + {-0.934639129819680669619685886573, 0.355597661704784018255054434121}, + {-0.935725689481080258325107479322, 0.352728555755210948507993862222}, + {-0.936803441735921671451592374069, 0.349856129790134862123096581854}, + {-0.937872376439989774432604008325, 0.346980410845923736840035189744}, + {-0.938932483532064487974366784329, 0.344101425989939035954279233920}, + {-0.939983753034013824745329657162, 0.341219202320282688489783140540}, + {-0.941026175050889257533981435699, 0.338333766965541182791810115305}, + {-0.942059739771017312648382358020, 0.335445147084531714032351601418}, + {-0.943084437466093383761744917138, 0.332553369866044445934960549494}, + {-0.944100258491272659178150661319, 0.329658462528587437034843787842}, + {-0.945107193285260605009057144343, 0.326760452320131844494710549043}, + {-0.946105232370403337327502413245, 0.323859366517853020095429883440}, + {-0.947094366352777106143889795931, 0.320955232427875492007274260686}, + {-0.948074585922276225069538213575, 0.318048077385014893447845452101}, + {-0.949045881852700556891022642958, 0.315137928752522500364108282156}, + {-0.950008245001842999144514578802, 0.312224813921825106177720954292}, + {-0.950961666311574971288678170822, 0.309308760312269004355556489827}, + {-0.951906136807932345966776210844, 0.306389795370860917866906447671}, + {-0.952841647601198604711214557028, 0.303467946572011426642490050654}, + {-0.953768189885990214094135808409, 0.300543241417273676585608654932}, + {-0.954685754941338338142031716416, 0.297615707435086140897340101219}, + {-0.955594334130771105861867908970, 0.294685372180514382201010903373}, + {-0.956493918902394990588788914465, 0.291752263234989428486443330257}, + {-0.957384500788975856266915798187, 0.288816408206049757279032519364}, + {-0.958266071408017672261792085919, 0.285877834727080559762413258795}, + {-0.959138622461841894306644462631, 0.282936570457055447391780944599}, + {-0.960002145737665846247921308532, 0.279992643080273440059357881182}, + {-0.960856633107679547478596759902, 0.277046080306100228618504388578}, + {-0.961702076529122540371474769927, 0.274096909868706384294512190536}, + {-0.962538468044359163400258694310, 0.271145159526808121608354440468}, + {-0.963365799780953935282923339400, 0.268190857063403398363732321741}, + {-0.964184063951745828902062385168, 0.265234030285511734881254142238}, + {-0.964993252854920324779186557862, 0.262274707023913700165707041378}, + {-0.965793358874083573972768590465, 0.259312915132886401270440046574}, + {-0.966584374478333008262609382655, 0.256348682489943191509240705273}, + {-0.967366292222328505445716473332, 0.253382036995570103510289072801}, + {-0.968139104746362333386855425488, 0.250413006572965335383429419380}, + {-0.968902804776428872024496286031, 0.247441619167773491083650583278}, + {-0.969657385124292336975315720338, 0.244467902747824483711269749620}, + {-0.970402838687555502339421309443, 0.241491885302869357943222894392}, + {-0.971139158449725092836501971760, 0.238513594844318554955009403784}, + {-0.971866337480279285365725172596, 0.235533059404975736450538192912}, + {-0.972584368934732212963467645750, 0.232550307038775161405652625035}, + {-0.973293246054698246716441190074, 0.229565365820518924033777352633}, + {-0.973992962167955833585608615977, 0.226578263845610167193100892291}, + {-0.974683510688510668096284916828, 0.223589029229790292596646850143}, + {-0.975364885116656976649096577603, 0.220597690108873506487086046945}, + {-0.976037079039039023875545808551, 0.217604274638483724535475971607}, + {-0.976700086128711730815155078744, 0.214608810993786980336750502829}, + {-0.977353900145199960824982099439, 0.211611327369227886219249512578}, + {-0.977998514934557139355320032337, 0.208611851978263512785716216058}, + {-0.978633924429423096569280460244, 0.205610413053099377878041309486}, + {-0.979260122649082020984678820241, 0.202607038844421383227967226048}, + {-0.979877103699517637558358273964, 0.199601757621130915243412573545}, + {-0.980484861773469384971235740522, 0.196594597670080278861703959592}, + {-0.981083391150486594511903604143, 0.193585587295803801533011778702}, + {-0.981672686196983113049441271869, 0.190574754820253072784552728081}, + {-0.982252741366289372493270093400, 0.187562128582529574760684454304}, + {-0.982823551198705236409125518549, 0.184547736938619699742503144080}, + {-0.983385110321551181300492316950, 0.181531608261125215753040151867}, + {-0.983937413449218922778527485207, 0.178513770938997423654015506145}, + {-0.984480455383220931508958528866, 0.175494253377271453020469493822}, + {-0.985014231012239838136679281888, 0.172473083996796117123295744022}, + {-0.985538735312176061853506325861, 0.169450291233968208803872812496}, + {-0.986053963346195438965935409215, 0.166425903540464048546709818766}, + {-0.986559910264775408172965853737, 0.163399949382973280753716949221}, + {-0.987056571305750973799320036051, 0.160372457242928451170982384610}, + {-0.987543941794359225738730856392, 0.157343455616238553362862262475}, + {-0.988022017143283526330321819842, 0.154312973013020077184265232972}, + {-0.988490792852696587011962492397, 0.151281037957330305454561880651}, + {-0.988950264510302989862111644470, 0.148247678986896253006122492479}, + {-0.989400427791380376874030844192, 0.145212924652847352735562935777}, + {-0.989841278458820528207695588208, 0.142176803519448058388263689267}, + {-0.990272812363169108174076882278, 0.139139344163826339517697761039}, + {-0.990695025442664634063305584277, 0.136100575175706478558979029003}, + {-0.991107913723276889861324434605, 0.133060525157139009078122171559}, + {-0.991511473318743896676608073903, 0.130019222722233429578864161158}, + {-0.991905700430609327256092910829, 0.126976696496886060083753022809}, + {-0.992290591348257255965847889456, 0.123932975118512478385213171350}, + {-0.992666142448948018994769881829, 0.120888087235777055838958915501}, + {-0.993032350197851410023019980144, 0.117842061508325088303728023220}, + {-0.993389211148080653046577026544, 0.114794926606510305777675284844}, + {-0.993736721940724598844951742649, 0.111746711211126503737744997125}, + {-0.994074879304879366337388546526, 0.108697444013138744267621405015}, + {-0.994403680057679095760647669522, 0.105647153713410754671819802297}, + {-0.994723121104325702646065110457, 0.102595869022436558815059015615}, + {-0.995033199438118631796612589824, 0.099543618660069277392921094361}, + {-0.995333912140482279795605791151, 0.096490431355252662126709140011}, + {-0.995625256380994305693832302495, 0.093436335845747967021601709803}, + {-0.995907229417411721250630307622, 0.090381360877865288272481336662}, + {-0.996179828595696981174967277184, 0.087325535206192059223262447176}, + {-0.996443051350042630076586647192, 0.084268887593324182105902764306}, + {-0.996696895202896060439456960012, 0.081211446809592663376164978217}, + {-0.996941357764982161171474217554, 0.078153241632794148707752412975}, + {-0.997176436735326077176466696983, 0.075094300847921346964142230718}, + {-0.997402129901275302792384991335, 0.072034653246889471245317793091}, + {-0.997618435138519554783442799817, 0.068974327628267023682084868597}, + {-0.997825350411111644532979880751, 0.065913352797003763039462853612}, + {-0.998022873771486240812578216719, 0.062851757564161489511000979746}, + {-0.998211003360478188461968329648, 0.059789570746640069431876440831}, + {-0.998389737407340160935120820795, 0.056726821166908067417544714317}, + {-0.998559074229759313645615748101, 0.053663537652730519678101472891}, + {-0.998719012233872938111289840890, 0.050599749036899392684585308189}, + {-0.998869549914283560987371402007, 0.047535484156959538493136818715}, + {-0.999010685854073376965800434846, 0.044470771854938584422001213170}, + {-0.999142418724816905317709370138, 0.041405640977076774156273586414}, + {-0.999264747286594423592021030345, 0.038340120373552853683118968320}, + {-0.999377670388002847801089956192, 0.035274238898214231585637179478}, + {-0.999481186966166945673251120752, 0.032208025408304544190407625592}, + {-0.999575296046749217637739093334, 0.029141508764193801983566345370}, + {-0.999659996743959222698094890802, 0.026074717829104098604231509739}, + {-0.999735288260561683060245741217, 0.023007681468839694810535334568}, + {-0.999801169887884255693677459931, 0.019940428551514437910396893017}, + {-0.999857641005823860602674812981, 0.016872987947281835319213172397}, + {-0.999904701082852787052956955449, 0.013805388528060631714300399153}, + {-0.999942349676023911619893169700, 0.010737659167264410747799630030}, + {-0.999970586430974139879879203363, 0.007669828739531137778984160036}, + {-0.999989411081928403213225919899, 0.004601926120448732691892157476}, + {-0.999998823451701879250208548910, 0.001533980186285049344269149074}}; +__device__ double2 negTwids12[2048] = { + {0.999999705862882226625742987380, 0.000766990318742704485499572797}, + {0.999997352766978209182013870304, 0.002300969151425804985755529941}, + {0.999992646580707189585268679366, 0.003834942569706227544212850944}, + {0.999985587315143198416933500994, 0.005368906963996342499023661787}, + {0.999976174986897614616054852377, 0.006902858724729755805771258537}, + {0.999964409618118277300879981340, 0.008436794242369798774161537835}, + {0.999950291236490484969579028984, 0.009970709907418030815140497225}, + {0.999933819875235996299522867048, 0.011504602110422713565074381847}, + {0.999914995573113474236492947966, 0.013038467241987334449548896487}, + {0.999893818374418485994681304874, 0.014572301692779064327676330493}, + {0.999870288328982947945178239024, 0.016106101853537287127426935740}, + {0.999844405492175236638274782308, 0.017639864115082053153127361611}, + {0.999816169924900410848067622283, 0.019173584868322622598579840769}, + {0.999785581693599212371736939531, 0.020707260504265894568431960465}, + {0.999752640870248843185663645272, 0.022240887414024960999636704173}, + {0.999717347532362188289312143752, 0.023774461988827554764780458640}, + {0.999679701762987926727532794757, 0.025307980620024570633797011965}, + {0.999639703650710198523654526070, 0.026841439699098530724530320413}, + {0.999597353289648382634879908437, 0.028374835617672098525554602588}, + {0.999552650779456985929982693051, 0.029908164767516554755077962113}, + {0.999505596225325310122400424007, 0.031441423540560300975421625935}, + {0.999456189737977340747931975784, 0.032974608328897335451923567007}, + {0.999404431433671303075527703186, 0.034507715524795749828523838687}, + {0.999350321434199440062684516306, 0.036040741520706229272796861096}, + {0.999293859866887790310840955499, 0.037573682709270493640385524259}, + {0.999235046864595854998469803832, 0.039106535483329887825654225253}, + {0.999173882565716375836473162053, 0.040639296235933736189949172513}, + {0.999110367114174890978972598532, 0.042171961360347946790039230791}, + {0.999044500659429290934099299193, 0.043704527250063421317527456722}, + {0.998976283356469818563994067517, 0.045236990298804589938352904710}, + {0.998905715365818291928690086934, 0.046769346900537862865565585935}, + {0.998832796853527993263810458302, 0.048301593449480144382146562521}, + {0.998757527991183335913660812366, 0.049833726340107277474889002633}, + {0.998679908955899087175112072146, 0.051365741967162592551687794185}, + {0.998599939930320368297600452934, 0.052897636725665324319844984302}, + {0.998517621102622210393917612237, 0.054429407010919132747783777404}, + {0.998432952666508444217186024616, 0.055961049218520568515611302018}, + {0.998345934821212366294673756784, 0.057492559744367566221256993231}, + {0.998256567771495184615559992380, 0.059023934984667930647717071224}, + {0.998164851727646240675539957010, 0.060555171335947788335829500284}, + {0.998070786905482343343010143144, 0.062086265195060087729306275151}, + {0.997974373526346991702951072511, 0.063617212959193106258659611285}, + {0.997875611817110153012322371069, 0.065148011025878832525037864798}, + {0.997774502010167818610852918937, 0.066678655793001556650878569599}, + {0.997671044343441004720318687760, 0.068209143658806328791577300308}, + {0.997565239060375752444542740704, 0.069739471021907306624854072652}, + {0.997457086409941906524068144790, 0.071269634281296401212557611871}, + {0.997346586646633226358460433403, 0.072799629836351673062289080463}, + {0.997233740030466275783282981138, 0.074329454086845755944601421561}, + {0.997118546826979978980887153739, 0.075859103432954447243652396082}, + {0.997001007307235287413504920551, 0.077388574275265048507677079215}, + {0.996881121747813847555619304330, 0.078917863014784941921853089752}, + {0.996758890430818000893964381248, 0.080446966052950014125499933471}, + {0.996634313643869895749105580762, 0.081975879791633066151490538687}, + {0.996507391680110821141624910524, 0.083504600633152431532479909038}, + {0.996378124838200207591398793738, 0.085033124980280275218014196525}, + {0.996246513422315516095295606647, 0.086561449236251170047395930851}, + {0.996112557742151127904151053372, 0.088089569804770506689095554975}, + {0.995976258112917789411255853338, 0.089617483090022959091314191937}, + {0.995837614855341612951633578632, 0.091145185496681005443697642932}, + {0.995696628295663521690528341423, 0.092672673429913310361172307239}, + {0.995553298765638472467287556356, 0.094199943295393204212295756861}, + {0.995407626602534900683849627967, 0.095726991499307162447607311151}, + {0.995259612149133388037114400504, 0.097253814448363271050190803635}, + {0.995109255753726107407430845342, 0.098780408549799622597298309756}, + {0.994956557770116378769387210923, 0.100306770211392864977639760582}, + {0.994801518557617114879576547537, 0.101832895841466528064067631476}, + {0.994644138481050710254294244805, 0.103358781848899614064229979249}, + {0.994484417910747597879606018978, 0.104884424643134965826618554274}, + {0.994322357222545805122138062870, 0.106409820634187676779980336050}, + {0.994157956797789732483749958192, 0.107934966232653653528394954719}, + {0.993991217023329376445417437935, 0.109459857849717984157322803185}, + {0.993822138291519663333417611284, 0.110984491897163389806379996116}, + {0.993650721000219117051699413423, 0.112508864787378690119901136768}, + {0.993476965552789192948068830447, 0.114032972933367199308563044724}, + {0.993300872358093278613466736715, 0.115556812748755260988886561790}, + {0.993122441830495583658944269700, 0.117080380647800588733709048483}, + {0.992941674389860473581848054891, 0.118603673045400717644959343033}, + {0.992758570461551137498190655606, 0.120126686357101497559796143833}, + {0.992573130476428810986533335381, 0.121649416999105530745595160624}, + {0.992385354870851665864961432817, 0.123171861388280484694845995364}, + {0.992195244086673922012664661452, 0.124694015942167640842441755922}, + {0.992002798571244515102307559573, 0.126215877078990346138454015090}, + {0.991808018777406430466214715125, 0.127737441217662311965241883627}, + {0.991610905163495370828741215519, 0.129258704777796135099166008331}, + {0.991411458193338535060945559962, 0.130779664179711707650000107606}, + {0.991209678336254063069077346881, 0.132300315844444654755918122646}, + {0.991005566067049370460040336184, 0.133820656193754716767330137372}, + {0.990799121866020371385275211651, 0.135340681650134214697445145248}, + {0.990590346218950146273130030750, 0.136860388636816376894955737953}, + {0.990379239617108164672742987023, 0.138379773577783887761327719090}, + {0.990165802557248397874900547322, 0.139898832897777214423484792860}, + {0.989950035541608985845130064263, 0.141417563022303016673220099619}, + {0.989731939077910571889162838488, 0.142935960377642667928910213959}, + {0.989511513679355192429909493512, 0.144454021390860470885897370863}, + {0.989288759864625166784435350564, 0.145971742489812206233779079412}, + {0.989063678157881542851725953369, 0.147489120103153570351395273974}, + {0.988836269088763542001174755569, 0.149006150660348446468361771622}, + {0.988606533192386449648836332926, 0.150522830591677397871208654578}, + {0.988374471009341282190518995776, 0.152039156328246050087216190150}, + {0.988140083085692566555735538714, 0.153555124301993445312675135028}, + {0.987903369972977785096190928016, 0.155070730945700507863449502111}, + {0.987664332228205710251245363906, 0.156585972692998426358812480430}, + {0.987422970413855405347192117915, 0.158100845978376980394131123830}, + {0.987179285097874337218115670112, 0.159615347237193061502580349043}, + {0.986933276853677710072076934011, 0.161129472905678805538798314956}, + {0.986684946260146689134273856325, 0.162643219420950307929629730097}, + {0.986434293901627179401714329288, 0.164156583221015811568932463160}, + {0.986181320367928271330981715437, 0.165669560744784116756989078567}, + {0.985926026254321130615210222459, 0.167182148432072935628767140770}, + {0.985668412161537554894152890483, 0.168694342723617329848906365442}, + {0.985408478695768419441947116866, 0.170206140061078065039978923778}, + {0.985146226468662233877182643482, 0.171717536887049965210749746802}, + {0.984881656097323698872969544027, 0.173228529645070322695588060924}, + {0.984614768204312595933913598856, 0.174739114779627197071576460985}, + {0.984345563417641900016974432219, 0.176249288736167908364649292707}, + {0.984074042370776447263835962076, 0.177759047961107169433248031964}, + {0.983800205702631602733276849904, 0.179268388901835745707913361002}, + {0.983524054057571261999726175418, 0.180777308006728587574940547711}, + {0.983245588085407073997146198963, 0.182285801725153295826942212443}, + {0.982964808441396442617588036228, 0.183793866507478448335533016689}, + {0.982681715786240861376654720516, 0.185301498805081898968438736119}, + {0.982396310786084692168174115068, 0.186808695070359270795634643036}, + {0.982108594112513610951964437845, 0.188315451756732116228576501271}, + {0.981818566442552498330087473732, 0.189821765318656410226338948632}, + {0.981526228458664773413033799443, 0.191327632211630904723875801210}, + {0.981231580848749729284463683143, 0.192833048892205233260099817016}, + {0.980934624306141644822787384328, 0.194338011817988598473050387838}, + {0.980635359529608119366628216085, 0.195842517447657848972397687248}, + {0.980333787223347963291075757297, 0.197346562240965917034429821797}, + {0.980029908096990087784661227488, 0.198850142658750089763586288427}, + {0.979723722865591173381005773990, 0.200353255162940446787445125665}, + {0.979415232249634781780400771822, 0.201855896216568048151529524148}, + {0.979104436975029246426061035891, 0.203358062283773316503143746559}, + {0.978791337773105674102680495707, 0.204859749829814419275209047555}, + {0.978475935380616834713407570234, 0.206360955321075512092221515559}, + {0.978158230539735051856098380085, 0.207861675225075065442936761428}, + {0.977838223998050426466477347276, 0.209361906010474163597478991505}, + {0.977515916508569282505902720004, 0.210861644147084859035601311916}, + {0.977191308829712279582224709884, 0.212360886105878415852643570361}, + {0.976864401725312636592946091696, 0.213859628358993747454519507301}, + {0.976535195964614466390685265651, 0.215357867379745548941372135232}, + {0.976203692322270555337127007078, 0.216855599642632623780258427360}, + {0.975869891578341031035392916237, 0.218352821623346321500136468785}, + {0.975533794518291363928597093036, 0.219849529798778697831096451409}, + {0.975195401932990368898401811748, 0.221345720647030813621469746977}, + {0.974854714618708428908178120764, 0.222841390647421117021664827007}, + {0.974511733377115718646166442340, 0.224336536280493603623398257696}, + {0.974166459015280317146334709832, 0.225831154028026170887955004218}, + {0.973818892345666098364631579898, 0.227325240373038861552146272516}, + {0.973469034186131065844449494762, 0.228818791799802218056569813598}, + {0.973116885359925132270575431903, 0.230311804793845442684840918446}, + {0.972762446695688565156956428837, 0.231804275841964779747428337942}, + {0.972405719027449766400650332798, 0.233296201432231592454158430883}, + {0.972046703194623495924986400496, 0.234787578054000967142656008946}, + {0.971685400042008540211213585280, 0.236278402197919568106243559669}, + {0.971321810419786157986266061926, 0.237768670355934186311230860156}, + {0.970955935183517970799016438832, 0.239258379021299982802872818866}, + {0.970587775194143631551924045198, 0.240747524688588426799995545480}, + {0.970217331317979159166497993283, 0.242236103853696010945739658382}, + {0.969844604426714829159550390614, 0.243724113013852161646610738899}, + {0.969469595397413064219449552184, 0.245211548667627537989588404344}, + {0.969092305112506213760070750141, 0.246698407314942413925962227950}, + {0.968712734459794777563956813538, 0.248184685457074782899411502513}, + {0.968330884332445185336268878018, 0.249670379596668545740811850919}, + {0.967946755628987798303342060535, 0.251155486237741920607646761709}, + {0.967560349253314355699728821492, 0.252640001885695519856511737089}, + {0.967171666114676642500569414551, 0.254123923047320621204647750346}, + {0.966780707127683269774820473685, 0.255607246230807383380323472011}, + {0.966387473212298897529137775564, 0.257089967945753117284368727269}, + {0.965991965293840570971894976537, 0.258572084703170335107103028349}, + {0.965594184302976832334763912513, 0.260053593015495188023322725712}, + {0.965194131175724723270548111032, 0.261534489396595515309229540435}, + {0.964791806853447897474040928500, 0.263014770361779004481661559112}, + {0.964387212282854289213673837367, 0.264494432427801628993080385044}, + {0.963980348415994114930072100833, 0.265973472112875586326197208109}, + {0.963571216210257319723098135000, 0.267451885936677624666657493435}, + {0.963159816628371356905802258552, 0.268929670420357258553423207559}, + {0.962746150638399411647583292506, 0.270406822086544817995701350810}, + {0.962330219213737403372022072290, 0.271883337459359719634477414729}, + {0.961912023333112209400042047491, 0.273359213064418682392897608224}, + {0.961491563980579000414650181483, 0.274834445428843943126651083730}, + {0.961068842145519353081795088656, 0.276309031081271083696293544563}, + {0.960643858822638585515107934043, 0.277782966551857690706839321138}, + {0.960216615011963425807550720492, 0.279256248372291182580084978326}, + {0.959787111718839902607669500867, 0.280728873075797191738445235387}, + {0.959355349953930791606637740188, 0.282200837197147558210730267092}, + {0.958921330733213173047602140286, 0.283672137272668434260225467369}, + {0.958485055077976100257330926979, 0.285142769840248666568527369236}, + {0.958046524014818601244769524783, 0.286612731439347789841320945925}, + {0.957605738575646348031966681447, 0.288082018611004131436459374527}, + {0.957162699797670213364142455248, 0.289550627897843027014346262149}, + {0.956717408723403051062916802039, 0.291018555844085091699469103332}, + {0.956269866400658030691772637510, 0.292485798995553880619269193630}, + {0.955820073882545417909284424240, 0.293952353899684659666036168346}, + {0.955368032227470354023068921379, 0.295418217105532010524626684855}, + {0.954913742499130524521433471818, 0.296883385163778268367451573795}, + {0.954457205766513494538116901822, 0.298347854626741404437950677675}, + {0.953998423103894488406240270706, 0.299811622048383352723277539553}, + {0.953537395590833281033837920404, 0.301274683984317948048925472904}, + {0.953074124312172199502413150185, 0.302737036991819141729109787775}, + {0.952608610358033347509376653761, 0.304198677629829106194847554434}, + {0.952140854823815829810484956397, 0.305659602458966117577432441976}, + {0.951670858810193864840698552143, 0.307119808041533104425724332032}, + {0.951198623423113232000503103336, 0.308579290941525086200414307314}, + {0.950724149773789606321372502862, 0.310038047724637888524767959098}, + {0.950247438978705227796694998688, 0.311496074958275914745797763317}, + {0.949768492159606680935723943549, 0.312953369211560195051191612947}, + {0.949287310443502119206016232056, 0.314409927055336657630846275424}, + {0.948803894962658489475870737806, 0.315865745062183955749190999995}, + {0.948318246854599089523674138036, 0.317320819806421738906720975137}, + {0.947830367262101014524944275763, 0.318775147864118479912320935910}, + {0.947340257333192048427861209348, 0.320228725813099857067101083885}, + {0.946847918221147999418008112116, 0.321681550232956581236720694505}, + {0.946353351084490590494624484563, 0.323133617705052333946014186949}, + {0.945856557086983906756927353854, 0.324584924812532149562827044065}, + {0.945357537397632285980364486022, 0.326035468140330242370339419722}, + {0.944856293190677209992145435535, 0.327485244275178000172843439941}, + {0.944352825645594751158284907433, 0.328934249805612199946125429051}, + {0.943847135947092685803738731920, 0.330382481321982779398638285784}, + {0.943339225285107718654842301476, 0.331829935416461108133034940693}, + {0.942829094854802707281749007961, 0.333276608683047925740794426019}, + {0.942316745856563775518566217215, 0.334722497717581224385696714307}, + {0.941802179495997648928096168675, 0.336167599117744519965356175817}, + {0.941285396983928657199669487454, 0.337611909483074623672393954621}, + {0.940766399536396069613886083971, 0.339055425414969635600215269733}, + {0.940245188374650875395843740989, 0.340498143516697160393391641264}, + {0.939721764725153341224483938277, 0.341940060393402189831135729037}, + {0.939196129819569902608122902166, 0.343381172652115040921927402451}, + {0.938668284894770166282285117632, 0.344821476901759293998139810355}, + {0.938138231192824356696746690432, 0.346260969753160008366421607207}, + {0.937605969960999985346461471636, 0.347699647819051382846566866647}, + {0.937071502451759186236301957251, 0.349137507714084971421897307664}, + {0.936534829922755496234287875268, 0.350574546054837510311585901945}, + {0.935995953636831412580932010314, 0.352010759459819078109887868777}, + {0.935454874862014618130956478126, 0.353446144549480811836161819883}, + {0.934911594871516093974150862778, 0.354880697946222789518344598036}, + {0.934366114943725789565576178575, 0.356314416274402412376787196990}, + {0.933818436362210957391027932317, 0.357747296160341898829670981286}, + {0.933268560415712045141845010221, 0.359179334232336500143389912409}, + {0.932716488398140253224255502573, 0.360610527120662271993722924890}, + {0.932162221608574426134907753294, 0.362040871457584179093913689940}, + {0.931605761351257832814098946983, 0.363470363877363755733540529036}, + {0.931047108935595280065911083511, 0.364899001016267265917747408821}, + {0.930486265676149781889137102553, 0.366326779512573585950718779713}, + {0.929923232892639672897416858177, 0.367753696006581975996851952004}, + {0.929358011909935499694768168411, 0.369179747140620018175383165726}, + {0.928790604058057023273420327314, 0.370604929559051665677316123038}, + {0.928221010672169444255530379451, 0.372029239908285014326594364320}, + {0.927649233092581182447133869573, 0.373452674836780296185878569304}, + {0.927075272664740102079861117090, 0.374875230995057540095416470649}, + {0.926499130739230514208770728146, 0.376296905035704787323425080103}, + {0.925920808671770068087880645180, 0.377717693613385641082658139567}, + {0.925340307823206309478791808942, 0.379137593384847315647334653477}, + {0.924757629559513905093126595602, 0.380556601008928518936613727419}, + {0.924172775251791200901152478764, 0.381974713146567224075766944225}, + {0.923585746276256669418103228963, 0.383391926460808663001955665095}, + {0.922996544014246245168919813295, 0.384808237616812875980798480668}, + {0.922405169852209882996874057426, 0.386223643281862982767904668435}, + {0.921811625181708116372192307608, 0.387638140125372732125441643802}, + {0.921215911399408726722981555213, 0.389051724818894384405609798705}, + {0.920618029907083967877667873836, 0.390464394036126594134117340218}, + {0.920017982111606569262107768736, 0.391876144452922348104806360425}, + {0.919415769424947071364329076459, 0.393286972747296403873917824967}, + {0.918811393264170050976247239305, 0.394696875599433560921625030460}, + {0.918204855051430901546893892373, 0.396105849691696265679752286815}, + {0.917596156213972946602552838158, 0.397513891708632327581796062077}, + {0.916985298184122998854661545920, 0.398920998336982912668702283554}, + {0.916372282399289139753761901375, 0.400327166265690093105433788878}, + {0.915757110301956722686611556128, 0.401732392185905007320201320908}, + {0.915139783339685264351714977238, 0.403136672790995298498728516279}, + {0.914520302965104447956434796652, 0.404540004776552997167726744010}, + {0.913898670635911680726337635861, 0.405942384840402514800672406636}, + {0.913274887814867764035398067790, 0.407343809682607971289769466239}, + {0.912648955969793895803832128877, 0.408744276005481355085180439346}, + {0.912020876573568339829023443599, 0.410143780513590239245047541772}, + {0.911390651104122428982634573913, 0.411542319913765219929757677164}, + {0.910758281044437567608440531330, 0.412939890915108076541173431906}, + {0.910123767882541678808649976418, 0.414336490228999099194595601148}, + {0.909487113111505429685621493263, 0.415732114569105359880296646224}, + {0.908848318229439122717394639039, 0.417126760651387873402029526915}, + {0.908207384739488698954801293439, 0.418520425194109702005107465084}, + {0.907564314149832629396996708238, 0.419913104917843615915273858263}, + {0.906919107973678140233175781759, 0.421304796545479642855269730717}, + {0.906271767729257660128894258378, 0.422695496802232950628308572050}, + {0.905622294939825267512389928015, 0.424085202415651563168097482048}, + {0.904970691133653248883206288156, 0.425473910115623799033102159228}, + {0.904316957844028324053908818314, 0.426861616634386431545777895735}, + {0.903661096609247982414103717019, 0.428248318706531960753380872120}, + {0.903003108972617152261364026344, 0.429634013069016384989140533435}, + {0.902342996482444203998340981343, 0.431018696461167027944583196586}, + {0.901680760692037730485992597096, 0.432402365624690143697250732657}, + {0.901016403159702328196090093115, 0.433785017303678521738419249232}, + {0.900349925448735599609051405423, 0.435166648244619258534271466488}, + {0.899681329127423934366447610955, 0.436547255196401196020161705746}, + {0.899010615769039067579626589577, 0.437926834910322859695241959344}, + {0.898337786951834305071429298550, 0.439305384140099952627878110434}, + {0.897662844259040859640208509518, 0.440682899641872904972217384056}, + {0.896985789278863965279242620454, 0.442059378174214701040511954488}, + {0.896306623604479546507661780197, 0.443434816498138484330837627567}, + {0.895625348834030110545256775367, 0.444809211377104884999056366723}, + {0.894941966570620750509590379806, 0.446182559577030068975744825366}, + {0.894256478422316036791528404137, 0.447554857866293009927005641657}, + {0.893568886002135909230048582685, 0.448926103015743260815639814609}, + {0.892879190928051680309351922915, 0.450296291798708614440016617664}, + {0.892187394822982482445183904929, 0.451665420991002486417187355983}, + {0.891493499314791382204248293419, 0.453033487370931575721755280028}, + {0.890797506036281494523620949622, 0.454400487719303580735896730403}, + {0.890099416625192318974768568296, 0.455766418819434637743626126394}, + {0.889399232724195520916055102134, 0.457131277457156981469665879558}, + {0.888696955980891600823667886289, 0.458495060420826272551408919753}, + {0.887992588047805564421821600263, 0.459857764501329535633544765005}, + {0.887286130582383147924474542378, 0.461219386492092375817719585029}, + {0.886577585246987043277044904244, 0.462579923189086805734859808581}, + {0.885866953708892790331219657674, 0.463939371390838517505983418232}, + {0.885154237640285113108973291673, 0.465297727898434598792221095209}, + {0.884439438718253811977376699360, 0.466654989515530915777929976684}, + {0.883722558624789655823406064883, 0.468011153048359829220714800613}, + {0.883003599046780829340264062921, 0.469366215305737521923390431766}, + {0.882282561676008714179886283091, 0.470720173099071603761700544055}, + {0.881559448209143781127750116866, 0.472073023242368661200885071594}, + {0.880834260347742037389195957076, 0.473424762552241529256491503475}, + {0.880106999798240363652723772248, 0.474775387847917118566698491122}, + {0.879377668271953294443221693655, 0.476124895951243576330824680554}, + {0.878646267485068133140657664626, 0.477473283686698057870501088473}, + {0.877912799158641843355610490107, 0.478820547881393887568179934533}, + {0.877177265018595941903356560942, 0.480166685365088385939458248686}, + {0.876439666795713612224005828466, 0.481511692970189864038133009672}, + {0.875700006225634597356588528783, 0.482855567531765672573129677403}, + {0.874958285048851647225376382266, 0.484198305887549029780103637677}, + {0.874214505010706299792389017966, 0.485539904877946959516066272045}, + {0.873468667861384884254505323042, 0.486880361346047341175591327556}, + {0.872720775355914302195969867171, 0.488219672137626792274289755369}, + {0.871970829254157808740899326949, 0.489557834101157440809259924208}, + {0.871218831320811015750393835333, 0.490894844087815085398318615262}, + {0.870464783325397672975043406041, 0.492230698951486023151602466896}, + {0.869708687042265671252039282990, 0.493565395548774765721589119494}, + {0.868950544250582379568470514641, 0.494898930739011255752757278970}, + {0.868190356734331314392250078527, 0.496231301384258249864700474063}, + {0.867428126282306921623899143015, 0.497562504349319145724450663693}, + {0.866663854688111134905170729326, 0.498892536501744587873474756634}, + {0.865897543750148823704648748389, 0.500221394711840683378056837682}, + {0.865129195271623796514859350282, 0.501549075852675385611689762300}, + {0.864358811060534026893265036051, 0.502875576800086987461213539063}, + {0.863586392929668100748585857218, 0.504200894432690338575753230543}, + {0.862811942696600331359491065086, 0.505525025631885394084008567006}, + {0.862035462183687206660920310242, 0.506847967281863209798586922261}, + {0.861256953218062171195867904316, 0.508169716269614601955595389882}, + {0.860476417631632073401704019489, 0.509490269484936364463578684081}, + {0.859693857261072613695773725340, 0.510809623820439040464691515808}, + {0.858909273947823903583298488229, 0.512127776171554693895870968845}, + {0.858122669538086135787580133183, 0.513444723436543459804681788228}, + {0.857334045882815587447112193331, 0.514760462516501204888186293829}, + {0.856543404837719957178876484249, 0.516074990315366632920301981358}, + {0.855750748263253924186244603334, 0.517388303739929056312973898457}, + {0.854956078024614929411484354205, 0.518700399699834946432019933127}, + {0.854159395991738845665963708598, 0.520011275107596038225210577366}, + {0.853360704039295425715749843221, 0.521320926878595658493509290565}, + {0.852560004046684083434115564160, 0.522629351931096608474547338119}, + {0.851757297898029119842533418705, 0.523936547186248602336888779973}, + {0.850952587482175726307787044789, 0.525242509568094706473573296535}, + {0.850145874692685210582965282811, 0.526547236003579444130195952312}, + {0.849337161427830777959968600044, 0.527850723422555234698450021824}, + {0.848526449590592646288200739946, 0.529152968757790609366509215761}, + {0.847713741088654382238587459142, 0.530453968944976317345663119340}, + {0.846899037834397239166150939127, 0.531753720922733319476094493439}, + {0.846082341744897048485540835827, 0.533052221632619449565027025528}, + {0.845263654741918224466701303754, 0.534349468019137519014805093320}, + {0.844442978751910655610402045568, 0.535645457029741089982621815579}, + {0.843620315706004153533115186292, 0.536940185614842913075506203313}, + {0.842795667540004123097219235206, 0.538233650727821699710773373226}, + {0.841969036194387676630412897794, 0.539525849325028894476474761177}, + {0.841140423614298082810591949965, 0.540816778365796668737175423303}, + {0.840309831749540769862960587488, 0.542106434812443915838287011866}, + {0.839477262554578551601025537821, 0.543394815630284799823357388959}, + {0.838642717988527297556800021994, 0.544681917787634528593798677321}, + {0.837806200015150936977192941413, 0.545967738255817569559269486490}, + {0.836967710602857017931910377229, 0.547252274009174088931217738718}, + {0.836127251724692266421357089712, 0.548535522025067390217145657516}, + {0.835284825358337368328420780017, 0.549817479283890908625664906140}, + {0.834440433486103194660188364651, 0.551098142769075427516156651109}, + {0.833594078094925139410520387173, 0.552377509467096072803826700692}, + {0.832745761176359455824069755181, 0.553655576367479307364760643395}, + {0.831895484726577594258856152010, 0.554932340462810369530188836507}, + {0.831043250746362316405679848685, 0.556207798748739934424634157040}, + {0.830189061241102366217603503173, 0.557481948223991552460176990280}, + {0.829332918220788251062458584784, 0.558754785890368310674602980725}, + {0.828474823700007134696932098450, 0.560026308752760382247970483149}, + {0.827614779697938396374468084105, 0.561296513819151465796153388510}, + {0.826752788238348523819354340958, 0.562565398100626556932013500045}, + {0.825888851349586783356926389388, 0.563832958611378165514338434150}, + {0.825022971064580223909956657735, 0.565099192368713976186711533956}, + {0.824155149420828569972741206584, 0.566364096393063842782567007816}, + {0.823285388460400113785908615682, 0.567627667707986227618732755218}, + {0.822413690229926386265901783190, 0.568889903340175862034300280357}, + {0.821540056780597605090576962539, 0.570150800319470296706469980563}, + {0.820664490168157456650988024194, 0.571410355678857229122513672337}, + {0.819786992452898988226195342577, 0.572668566454481164917922342283}, + {0.818907565699658945845840207767, 0.573925429685650745348368673149}, + {0.818026211977813444420348787389, 0.575180942414845075560947407212}, + {0.817142933361272971737321313412, 0.576435101687721829222255109926}, + {0.816257731928477392457921268942, 0.577687904553122799633513295703}, + {0.815370609762391285180171962566, 0.578939348063081782314043266524}, + {0.814481568950498613368438327598, 0.580189429272831680428623712942}, + {0.813590611584798506505933346489, 0.581438145240810166924916302378}, + {0.812697739761799486934990000009, 0.582685493028668455295360217860}, + {0.811802955582515473054172616685, 0.583931469701276184558480508713}, + {0.810906261152459673091641434439, 0.585176072326730412065387554321}, + {0.810007658581641143413776262605, 0.586419297976360498481085414824}, + {0.809107149984558238209331193502, 0.587661143724736656501761444815}, + {0.808204737480194723708848414390, 0.588901606649675724014514344162}, + {0.807300423192014449114140006714, 0.590140683832248824636224071583}, + {0.806394209247956239572374670388, 0.591378372356787584962489745521}, + {0.805486097780429233239374298137, 0.592614669310891128972684782639}, + {0.804576090926307108119885924680, 0.593849571785433627546524348872}, + {0.803664190826924085264693076169, 0.595083076874569960601490947738}, + {0.802750399628069155610887719376, 0.596315181675743710698611721455}, + {0.801834719479981306022864373517, 0.597545883289693158246791426791}, + {0.800917152537344301244104372017, 0.598775178820458719997077423614}, + {0.799997700959281909938169974339, 0.600003065375388944246992650733}, + {0.799076366909352353573581240198, 0.601229540065148504446312927030}, + {0.798153152555543754509415066423, 0.602454600003723750312190077238}, + {0.797228060070268806924786986201, 0.603678242308430368368021845527}, + {0.796301091630359114681425580784, 0.604900464099919821236994721403}, + {0.795372249417061305543086291436, 0.606121262502186120002534153173}, + {0.794441535616030591882008593529, 0.607340634642572929635662148939}, + {0.793508952417326662853724883462, 0.608558577651779453177027789934}, + {0.792574502015407689192727502814, 0.609775088663868425342684531643}, + {0.791638186609125882320370237721, 0.610990164816271663639213329589}, + {0.790700008401721610162837805547, 0.612203803249797950947197477944}, + {0.789759969600819067281349816767, 0.613416001108638586636345735315}, + {0.788818072418420279667827799130, 0.614626755540375047104362238315}, + {0.787874319070900219763586846966, 0.615836063695985092003581939935}, + {0.786928711779001810455724807980, 0.617043922729849758646025748021}, + {0.785981252767830151917394232441, 0.618250329799760245386153201252}, + {0.785031944266848080715703872556, 0.619455282066924017847497907496}, + {0.784080788509869952562780781591, 0.620658776695972136394630069844}, + {0.783127787735057312445974275761, 0.621860810854965362359791924973}, + {0.782172944184913010445825420902, 0.623061381715401263470255344146}, + {0.781216260106276094710153756751, 0.624260486452220653141864659119}, + {0.780257737750316593405841558706, 0.625458122243814362839486875600}, + {0.779297379372530296670618099597, 0.626654286272029348303647111607}, + {0.778335187232733205497936523898, 0.627848975722176461111700973561}, + {0.777371163595056313688758109492, 0.629042187783035999792957682075}, + {0.776405310727940389803336529440, 0.630233919646864371166827822890}, + {0.775437630904130537068397188705, 0.631424168509401861903995722969}, + {0.774468126400670864306619023409, 0.632612931569877412485425338673}, + {0.773496799498899045843813837564, 0.633800206031017276941952331981}, + {0.772523652484441325505315489863, 0.634985989099049463746382571117}, + {0.771548687647206299367041992809, 0.636170277983712173508479281736}, + {0.770571907281380807930304399633, 0.637353069898259128045481247682}, + {0.769593313685422941716751665808, 0.638534362059466786831762874499}, + {0.768612909162058377532389386033, 0.639714151687640453225469627796}, + {0.767630696018273384062524655747, 0.640892436006621379895875634247}, + {0.766646676565310380979667570500, 0.642069212243792541983111732407}, + {0.765660853118662498850710562692, 0.643244477630085853547825536225}, + {0.764673227998067139843385575659, 0.644418229399988384820119335927}, + {0.763683803527501869901072950597, 0.645590464791548690470790461404}, + {0.762692582035177979449258600653, 0.646761181046383915038688883214}, + {0.761699565853535376369620735204, 0.647930375409685344045840338367}, + {0.760704757319236923862604271562, 0.649098045130225953514013781387}, + {0.759708158773163444443810021767, 0.650264187460365850057542047580}, + {0.758709772560407391672754329193, 0.651428799656059820399889304099}, + {0.757709601030268076193863180379, 0.652591878976862438399564325664}, + {0.756707646536245670532139229181, 0.653753422685936058655897795688}, + {0.755703911436035880022643596021, 0.654913428050056034557258044515}, + {0.754698398091524502717675204622, 0.656071892339617601663803725387}, + {0.753691108868781212137832881126, 0.657228812828642539045631565386}, + {0.752682046138055338424521778506, 0.658384186794785053464806878765}, + {0.751671212273768429845688388014, 0.659538011519338662758116242912}, + {0.750658609654510700082141738676, 0.660690284287242302063702936721}, + {0.749644240663033478710985946236, 0.661841002387086874136912229005}, + {0.748628107686245436447336487618, 0.662990163111121466599229279382}, + {0.747610213115205146650055212376, 0.664137763755260013276426889206}, + {0.746590559345117310563466617168, 0.665283801619087178380596014904}, + {0.745569148775325429845395319717, 0.666428274005865239892898443941}, + {0.744545983809307365675067558186, 0.667571178222540306812504695699}, + {0.743521066854669121504173290305, 0.668712511579747981294019609777}, + {0.742494400323139180919440605066, 0.669852271391821019186352259567}, + {0.741465986630563289594419984496, 0.670990454976794215014024302945}, + {0.740435828196898015995941477740, 0.672127059656411729449132508307}, + {0.739403927446205755380503887864, 0.673262082756132973493379267893}, + {0.738370286806648623567639333487, 0.674395521605139047771615423699}, + {0.737334908710482905824790123006, 0.675527373536338515691568318289}, + {0.736297795594053172685278241261, 0.676657635886374952960409245861}, + {0.735258949897786839855484686268, 0.677786305995631499499154415389}, + {0.734218374066188284032818955893, 0.678913381208238408959232401685}, + {0.733176070547832736679083609488, 0.680038858872078932904514658730}, + {0.732132041795361288016863454686, 0.681162736338795427037950958038}, + {0.731086290265474336713680258981, 0.682285010963795568450507289526}, + {0.730038818418926260811474548973, 0.683405680106258683892406224913}, + {0.728989628720519422522272634524, 0.684524741129142300088972206140}, + {0.727938723639098617113063482975, 0.685642191399187472811149746121}, + {0.726886105647544966679163280787, 0.686758028286925892302861029748}, + {0.725831777222770369029092307755, 0.687872249166685545418431502185}, + {0.724775740845711280435637036135, 0.688984851416597043893830232264}, + {0.723717999001323497587634392403, 0.690095832418599952617910275876}, + {0.722658554178575607274126468837, 0.691205189558448451769834264269}, + {0.721597408870443768336144785280, 0.692312920225718220201827080018}, + {0.720534565573905272373167463229, 0.693419021813811764509694057779}, + {0.719470026789932992627996100055, 0.694523491719965524460178585286}, + {0.718403795023489832871632643219, 0.695626327345254868994572916563}, + {0.717335872783521732998224251787, 0.696727526094601201656075772917}, + {0.716266262582953117110662333289, 0.697827085376777289660310543695}, + {0.715194966938680121160132330260, 0.698925002604414147278077962255}, + {0.714121988371564819786385669431, 0.700021275194006253883571844199}, + {0.713047329406429342135709248396, 0.701115900565918659381736688374}, + {0.711970992572050098701197384798, 0.702208876144391869189576027566}, + {0.710892980401151675096116377972, 0.703300199357548727618905104464}, + {0.709813295430400836849571533094, 0.704389867637400413080683847511}, + {0.708731940200400645224476647854, 0.705477878419852100222442459199}, + {0.707648917255684350990918574098, 0.706564229144709510244126704492}, + {0.706564229144709621266429167008, 0.707648917255684350990918574098}, + {0.705477878419852211244744921714, 0.708731940200400645224476647854}, + {0.704389867637400413080683847511, 0.709813295430400836849571533094}, + {0.703300199357548727618905104464, 0.710892980401151675096116377972}, + {0.702208876144391869189576027566, 0.711970992572049987678894922283}, + {0.701115900565918659381736688374, 0.713047329406429231113406785880}, + {0.700021275194006364905874306714, 0.714121988371564708764083206916}, + {0.698925002604414147278077962255, 0.715194966938680010137829867745}, + {0.697827085376777289660310543695, 0.716266262582953117110662333289}, + {0.696727526094601201656075772917, 0.717335872783521732998224251787}, + {0.695626327345254868994572916563, 0.718403795023489721849330180703}, + {0.694523491719965524460178585286, 0.719470026789932992627996100055}, + {0.693419021813811875531996520294, 0.720534565573905272373167463229}, + {0.692312920225718220201827080018, 0.721597408870443657313842322765}, + {0.691205189558448451769834264269, 0.722658554178575607274126468837}, + {0.690095832418599952617910275876, 0.723717999001323386565331929887}, + {0.688984851416597154916132694780, 0.724775740845711280435637036135}, + {0.687872249166685545418431502185, 0.725831777222770369029092307755}, + {0.686758028286925892302861029748, 0.726886105647544966679163280787}, + {0.685642191399187472811149746121, 0.727938723639098617113063482975}, + {0.684524741129142300088972206140, 0.728989628720519311499970172008}, + {0.683405680106258794914708687429, 0.730038818418926149789172086457}, + {0.682285010963795568450507289526, 0.731086290265474225691377796466}, + {0.681162736338795427037950958038, 0.732132041795361288016863454686}, + {0.680038858872079043926817121246, 0.733176070547832736679083609488}, + {0.678913381208238408959232401685, 0.734218374066188173010516493378}, + {0.677786305995631499499154415389, 0.735258949897786728833182223752}, + {0.676657635886374952960409245861, 0.736297795594053061662975778745}, + {0.675527373536338626713870780804, 0.737334908710482794802487660490}, + {0.674395521605139047771615423699, 0.738370286806648512545336870971}, + {0.673262082756132973493379267893, 0.739403927446205755380503887864}, + {0.672127059656411840471434970823, 0.740435828196898015995941477740}, + {0.670990454976794215014024302945, 0.741465986630563289594419984496}, + {0.669852271391821130208654722082, 0.742494400323139180919440605066}, + {0.668712511579748092316322072293, 0.743521066854669121504173290305}, + {0.667571178222540306812504695699, 0.744545983809307254652765095670}, + {0.666428274005865350915200906456, 0.745569148775325429845395319717}, + {0.665283801619087178380596014904, 0.746590559345117310563466617168}, + {0.664137763755260013276426889206, 0.747610213115205146650055212376}, + {0.662990163111121466599229279382, 0.748628107686245325425034025102}, + {0.661841002387086874136912229005, 0.749644240663033478710985946236}, + {0.660690284287242302063702936721, 0.750658609654510589059839276160}, + {0.659538011519338773780418705428, 0.751671212273768429845688388014}, + {0.658384186794785053464806878765, 0.752682046138055227402219315991}, + {0.657228812828642650067934027902, 0.753691108868781212137832881126}, + {0.656071892339617712686106187903, 0.754698398091524391695372742106}, + {0.654913428050056145579560507031, 0.755703911436035880022643596021}, + {0.653753422685936169678200258204, 0.756707646536245670532139229181}, + {0.652591878976862549421866788180, 0.757709601030268076193863180379}, + {0.651428799656059820399889304099, 0.758709772560407391672754329193}, + {0.650264187460365961079844510095, 0.759708158773163444443810021767}, + {0.649098045130226064536316243903, 0.760704757319236923862604271562}, + {0.647930375409685455068142800883, 0.761699565853535265347318272688}, + {0.646761181046383915038688883214, 0.762692582035177868426956138137}, + {0.645590464791548801493092923920, 0.763683803527501869901072950597}, + {0.644418229399988384820119335927, 0.764673227998067139843385575659}, + {0.643244477630085853547825536225, 0.765660853118662387828408100177}, + {0.642069212243792541983111732407, 0.766646676565310380979667570500}, + {0.640892436006621379895875634247, 0.767630696018273273040222193231}, + {0.639714151687640453225469627796, 0.768612909162058266510086923518}, + {0.638534362059466786831762874499, 0.769593313685422941716751665808}, + {0.637353069898259128045481247682, 0.770571907281380696908001937118}, + {0.636170277983712173508479281736, 0.771548687647206299367041992809}, + {0.634985989099049463746382571117, 0.772523652484441325505315489863}, + {0.633800206031017276941952331981, 0.773496799498899045843813837564}, + {0.632612931569877523507727801189, 0.774468126400670864306619023409}, + {0.631424168509401861903995722969, 0.775437630904130426046094726189}, + {0.630233919646864482189130285406, 0.776405310727940389803336529440}, + {0.629042187783035999792957682075, 0.777371163595056202666455646977}, + {0.627848975722176572134003436076, 0.778335187232733094475634061382}, + {0.626654286272029459325949574122, 0.779297379372530296670618099597}, + {0.625458122243814362839486875600, 0.780257737750316593405841558706}, + {0.624260486452220653141864659119, 0.781216260106276094710153756751}, + {0.623061381715401374492557806661, 0.782172944184912899423522958386}, + {0.621860810854965362359791924973, 0.783127787735057312445974275761}, + {0.620658776695972136394630069844, 0.784080788509869952562780781591}, + {0.619455282066924017847497907496, 0.785031944266848080715703872556}, + {0.618250329799760245386153201252, 0.785981252767830151917394232441}, + {0.617043922729849758646025748021, 0.786928711779001699433422345464}, + {0.615836063695985092003581939935, 0.787874319070900108741284384450}, + {0.614626755540375047104362238315, 0.788818072418420168645525336615}, + {0.613416001108638586636345735315, 0.789759969600819067281349816767}, + {0.612203803249798061969499940460, 0.790700008401721610162837805547}, + {0.610990164816271774661515792104, 0.791638186609125771298067775206}, + {0.609775088663868425342684531643, 0.792574502015407578170425040298}, + {0.608558577651779453177027789934, 0.793508952417326662853724883462}, + {0.607340634642572929635662148939, 0.794441535616030591882008593529}, + {0.606121262502186231024836615688, 0.795372249417061194520783828921}, + {0.604900464099919932259297183919, 0.796301091630359114681425580784}, + {0.603678242308430368368021845527, 0.797228060070268695902484523685}, + {0.602454600003723861334492539754, 0.798153152555543754509415066423}, + {0.601229540065148615468615389545, 0.799076366909352353573581240198}, + {0.600003065375389055269295113249, 0.799997700959281909938169974339}, + {0.598775178820458719997077423614, 0.800917152537344301244104372017}, + {0.597545883289693269269093889307, 0.801834719479981306022864373517}, + {0.596315181675743821720914183970, 0.802750399628069155610887719376}, + {0.595083076874569960601490947738, 0.803664190826924085264693076169}, + {0.593849571785433627546524348872, 0.804576090926306997097583462164}, + {0.592614669310891128972684782639, 0.805486097780429122217071835621}, + {0.591378372356787584962489745521, 0.806394209247956239572374670388}, + {0.590140683832248935658526534098, 0.807300423192014449114140006714}, + {0.588901606649675835036816806678, 0.808204737480194723708848414390}, + {0.587661143724736767524063907331, 0.809107149984558127187028730987}, + {0.586419297976360498481085414824, 0.810007658581641143413776262605}, + {0.585176072326730412065387554321, 0.810906261152459673091641434439}, + {0.583931469701276295580782971228, 0.811802955582515362031870154169}, + {0.582685493028668455295360217860, 0.812697739761799486934990000009}, + {0.581438145240810277947218764893, 0.813590611584798506505933346489}, + {0.580189429272831680428623712942, 0.814481568950498613368438327598}, + {0.578939348063081893336345729040, 0.815370609762391285180171962566}, + {0.577687904553122799633513295703, 0.816257731928477392457921268942}, + {0.576435101687721829222255109926, 0.817142933361272971737321313412}, + {0.575180942414845186583249869727, 0.818026211977813444420348787389}, + {0.573925429685650745348368673149, 0.818907565699658945845840207767}, + {0.572668566454481164917922342283, 0.819786992452898988226195342577}, + {0.571410355678857340144816134853, 0.820664490168157456650988024194}, + {0.570150800319470296706469980563, 0.821540056780597605090576962539}, + {0.568889903340175973056602742872, 0.822413690229926386265901783190}, + {0.567627667707986227618732755218, 0.823285388460400113785908615682}, + {0.566364096393063953804869470332, 0.824155149420828569972741206584}, + {0.565099192368714087209013996471, 0.825022971064580223909956657735}, + {0.563832958611378165514338434150, 0.825888851349586783356926389388}, + {0.562565398100626556932013500045, 0.826752788238348523819354340958}, + {0.561296513819151465796153388510, 0.827614779697938396374468084105}, + {0.560026308752760382247970483149, 0.828474823700007134696932098450}, + {0.558754785890368310674602980725, 0.829332918220788251062458584784}, + {0.557481948223991663482479452796, 0.830189061241102366217603503173}, + {0.556207798748739934424634157040, 0.831043250746362316405679848685}, + {0.554932340462810369530188836507, 0.831895484726577594258856152010}, + {0.553655576367479307364760643395, 0.832745761176359455824069755181}, + {0.552377509467096072803826700692, 0.833594078094925139410520387173}, + {0.551098142769075427516156651109, 0.834440433486103194660188364651}, + {0.549817479283891019647967368655, 0.835284825358337368328420780017}, + {0.548535522025067390217145657516, 0.836127251724692155399054627196}, + {0.547252274009174088931217738718, 0.836967710602857017931910377229}, + {0.545967738255817680581571949006, 0.837806200015150936977192941413}, + {0.544681917787634528593798677321, 0.838642717988527297556800021994}, + {0.543394815630284799823357388959, 0.839477262554578551601025537821}, + {0.542106434812444026860589474381, 0.840309831749540769862960587488}, + {0.540816778365796668737175423303, 0.841140423614298082810591949965}, + {0.539525849325029005498777223693, 0.841969036194387676630412897794}, + {0.538233650727821699710773373226, 0.842795667540004123097219235206}, + {0.536940185614843024097808665829, 0.843620315706004042510812723776}, + {0.535645457029741089982621815579, 0.844442978751910655610402045568}, + {0.534349468019137519014805093320, 0.845263654741918224466701303754}, + {0.533052221632619671609631950560, 0.846082341744896937463238373311}, + {0.531753720922733319476094493439, 0.846899037834397350188453401643}, + {0.530453968944976317345663119340, 0.847713741088654271216284996626}, + {0.529152968757790720388811678276, 0.848526449590592646288200739946}, + {0.527850723422555456743054946855, 0.849337161427830666937666137528}, + {0.526547236003579333107893489796, 0.850145874692685210582965282811}, + {0.525242509568094706473573296535, 0.850952587482175726307787044789}, + {0.523936547186248602336888779973, 0.851757297898029119842533418705}, + {0.522629351931096719496849800635, 0.852560004046683972411813101644}, + {0.521320926878595547471206828050, 0.853360704039295425715749843221}, + {0.520011275107596038225210577366, 0.854159395991738734643661246082}, + {0.518700399699835168476624858158, 0.854956078024614818389181891689}, + {0.517388303739929056312973898457, 0.855750748263253924186244603334}, + {0.516074990315366632920301981358, 0.856543404837719957178876484249}, + {0.514760462516501204888186293829, 0.857334045882815587447112193331}, + {0.513444723436543570826984250743, 0.858122669538086024765277670667}, + {0.512127776171554693895870968845, 0.858909273947823903583298488229}, + {0.510809623820439040464691515808, 0.859693857261072613695773725340}, + {0.509490269484936364463578684081, 0.860476417631632073401704019489}, + {0.508169716269614712977897852397, 0.861256953218062060173565441801}, + {0.506847967281863320820889384777, 0.862035462183687206660920310242}, + {0.505525025631885505106311029522, 0.862811942696600331359491065086}, + {0.504200894432690560620358155575, 0.863586392929667989726283394702}, + {0.502875576800086876438911076548, 0.864358811060534026893265036051}, + {0.501549075852675385611689762300, 0.865129195271623685492556887766}, + {0.500221394711840683378056837682, 0.865897543750148823704648748389}, + {0.498892536501744754406928450408, 0.866663854688111023882868266810}, + {0.497562504349319090213299432435, 0.867428126282306921623899143015}, + {0.496231301384258305375851705321, 0.868190356734331314392250078527}, + {0.494898930739011311263908510227, 0.868950544250582379568470514641}, + {0.493565395548774876743891582009, 0.869708687042265560229736820474}, + {0.492230698951486078662753698154, 0.870464783325397672975043406041}, + {0.490894844087815140909469846520, 0.871218831320810904728091372817}, + {0.489557834101157551831562386724, 0.871970829254157697718596864433}, + {0.488219672137626736763138524111, 0.872720775355914302195969867171}, + {0.486880361346047396686742558813, 0.873468667861384884254505323042}, + {0.485539904877947015027217503302, 0.874214505010706299792389017966}, + {0.484198305887549140802406100192, 0.874958285048851536203073919751}, + {0.482855567531765672573129677403, 0.875700006225634597356588528783}, + {0.481511692970189919549284240929, 0.876439666795713612224005828466}, + {0.480166685365088441450609479944, 0.877177265018595941903356560942}, + {0.478820547881394054101633628306, 0.877912799158641732333308027592}, + {0.477473283686698057870501088473, 0.878646267485068133140657664626}, + {0.476124895951243631841975911811, 0.879377668271953183420919231139}, + {0.474775387847917229589000953638, 0.880106999798240363652723772248}, + {0.473424762552241529256491503475, 0.880834260347742037389195957076}, + {0.472073023242368661200885071594, 0.881559448209143781127750116866}, + {0.470720173099071714784003006571, 0.882282561676008603157583820575}, + {0.469366215305737632945692894282, 0.883003599046780718317961600405}, + {0.468011153048359829220714800613, 0.883722558624789655823406064883}, + {0.466654989515530971289081207942, 0.884439438718253700955074236845}, + {0.465297727898434654303372326467, 0.885154237640285113108973291673}, + {0.463939371390838461994832186974, 0.885866953708892790331219657674}, + {0.462579923189086805734859808581, 0.886577585246987043277044904244}, + {0.461219386492092431328870816287, 0.887286130582383147924474542378}, + {0.459857764501329646655847227521, 0.887992588047805564421821600263}, + {0.458495060420826217040257688495, 0.888696955980891711845970348804}, + {0.457131277457156981469665879558, 0.889399232724195520916055102134}, + {0.455766418819434748765928588909, 0.890099416625192207952466105780}, + {0.454400487719303747269350424176, 0.890797506036281494523620949622}, + {0.453033487370931575721755280028, 0.891493499314791382204248293419}, + {0.451665420991002541928338587240, 0.892187394822982482445183904929}, + {0.450296291798708725462319080179, 0.892879190928051680309351922915}, + {0.448926103015743260815639814609, 0.893568886002136020252351045201}, + {0.447554857866293009927005641657, 0.894256478422316036791528404137}, + {0.446182559577030124486896056624, 0.894941966570620750509590379806}, + {0.444809211377104996021358829239, 0.895625348834029999522954312852}, + {0.443434816498138428819686396309, 0.896306623604479657529964242713}, + {0.442059378174214756551663185746, 0.896985789278863965279242620454}, + {0.440682899641873015994519846572, 0.897662844259040748617906047002}, + {0.439305384140100063650180572949, 0.898337786951834194049126836035}, + {0.437926834910322859695241959344, 0.899010615769039067579626589577}, + {0.436547255196401251531312937004, 0.899681329127423934366447610955}, + {0.435166648244619369556573929003, 0.900349925448735599609051405423}, + {0.433785017303678521738419249232, 0.901016403159702328196090093115}, + {0.432402365624690143697250732657, 0.901680760692037730485992597096}, + {0.431018696461167083455734427844, 0.902342996482444203998340981343}, + {0.429634013069016496011442995950, 0.903003108972617041239061563829}, + {0.428248318706531905242229640862, 0.903661096609247982414103717019}, + {0.426861616634386487056929126993, 0.904316957844028324053908818314}, + {0.425473910115623910055404621744, 0.904970691133653248883206288156}, + {0.424085202415651674190399944564, 0.905622294939825156490087465500}, + {0.422695496802232950628308572050, 0.906271767729257660128894258378}, + {0.421304796545479698366420961975, 0.906919107973678029210873319244}, + {0.419913104917843726937576320779, 0.907564314149832518374694245722}, + {0.418520425194109702005107465084, 0.908207384739488698954801293439}, + {0.417126760651387873402029526915, 0.908848318229439122717394639039}, + {0.415732114569105415391447877482, 0.909487113111505429685621493263}, + {0.414336490228999210216898063663, 0.910123767882541567786347513902}, + {0.412939890915108021030022200648, 0.910758281044437567608440531330}, + {0.411542319913765275440908908422, 0.911390651104122317960332111397}, + {0.410143780513590350267350004287, 0.912020876573568228806720981083}, + {0.408744276005481521618634133119, 0.912648955969793895803832128877}, + {0.407343809682607971289769466239, 0.913274887814867764035398067790}, + {0.405942384840402570311823637894, 0.913898670635911680726337635861}, + {0.404540004776553108190029206526, 0.914520302965104447956434796652}, + {0.403136672790995242987577285021, 0.915139783339685264351714977238}, + {0.401732392185905007320201320908, 0.915757110301956722686611556128}, + {0.400327166265690148616585020136, 0.916372282399289139753761901375}, + {0.398920998336983023691004746070, 0.916985298184122887832359083404}, + {0.397513891708632327581796062077, 0.917596156213972946602552838158}, + {0.396105849691696321190903518072, 0.918204855051430901546893892373}, + {0.394696875599433671943927492975, 0.918811393264169939953944776789}, + {0.393286972747296570407371518741, 0.919415769424946960342026613944}, + {0.391876144452922348104806360425, 0.920017982111606569262107768736}, + {0.390464394036126649645268571476, 0.920618029907083856855365411320}, + {0.389051724818894495427912261221, 0.921215911399408726722981555213}, + {0.387638140125372676614290412545, 0.921811625181708116372192307608}, + {0.386223643281862982767904668435, 0.922405169852209882996874057426}, + {0.384808237616812931491949711926, 0.922996544014246245168919813295}, + {0.383391926460808774024258127611, 0.923585746276256558395800766448}, + {0.381974713146567224075766944225, 0.924172775251791200901152478764}, + {0.380556601008928574447764958677, 0.924757629559513905093126595602}, + {0.379137593384847426669637115992, 0.925340307823206198456489346427}, + {0.377717693613385807616111833340, 0.925920808671769957065578182664}, + {0.376296905035704787323425080103, 0.926499130739230514208770728146}, + {0.374875230995057595606567701907, 0.927075272664740102079861117090}, + {0.373452674836780407208181031820, 0.927649233092581182447133869573}, + {0.372029239908284958815443133062, 0.928221010672169444255530379451}, + {0.370604929559051665677316123038, 0.928790604058057023273420327314}, + {0.369179747140620073686534396984, 0.929358011909935499694768168411}, + {0.367753696006582087019154414520, 0.929923232892639561875114395662}, + {0.366326779512573585950718779713, 0.930486265676149781889137102553}, + {0.364899001016267376940049871337, 0.931047108935595169043608620996}, + {0.363470363877363866755842991552, 0.931605761351257832814098946983}, + {0.362040871457584345627367383713, 0.932162221608574315112605290778}, + {0.360610527120662271993722924890, 0.932716488398140253224255502573}, + {0.359179334232336555654541143667, 0.933268560415712045141845010221}, + {0.357747296160342009851973443801, 0.933818436362210957391027932317}, + {0.356314416274402356865635965733, 0.934366114943725900587878641090}, + {0.354880697946222789518344598036, 0.934911594871516093974150862778}, + {0.353446144549480867347313051141, 0.935454874862014618130956478126}, + {0.352010759459819244643341562551, 0.935995953636831301558629547799}, + {0.350574546054837565822737133203, 0.936534829922755496234287875268}, + {0.349137507714085026933048538922, 0.937071502451759186236301957251}, + {0.347699647819051493868869329162, 0.937605969960999985346461471636}, + {0.346260969753160174899875300980, 0.938138231192824356696746690432}, + {0.344821476901759293998139810355, 0.938668284894770166282285117632}, + {0.343381172652115096433078633709, 0.939196129819569902608122902166}, + {0.341940060393402300853438191552, 0.939721764725153341224483938277}, + {0.340498143516697104882240410006, 0.940245188374650875395843740989}, + {0.339055425414969635600215269733, 0.940766399536396069613886083971}, + {0.337611909483074679183545185879, 0.941285396983928657199669487454}, + {0.336167599117744686498809869590, 0.941802179495997648928096168675}, + {0.334722497717581224385696714307, 0.942316745856563775518566217215}, + {0.333276608683047981251945657277, 0.942829094854802707281749007961}, + {0.331829935416461219155337403208, 0.943339225285107718654842301476}, + {0.330382481321982945932091979557, 0.943847135947092685803738731920}, + {0.328934249805612199946125429051, 0.944352825645594751158284907433}, + {0.327485244275178055683994671199, 0.944856293190677209992145435535}, + {0.326035468140330353392641882238, 0.945357537397632285980364486022}, + {0.324584924812532149562827044065, 0.945856557086983906756927353854}, + {0.323133617705052333946014186949, 0.946353351084490590494624484563}, + {0.321681550232956636747871925763, 0.946847918221147999418008112116}, + {0.320228725813100023600554777659, 0.947340257333191937405558746832}, + {0.318775147864118479912320935910, 0.947830367262101014524944275763}, + {0.317320819806421794417872206395, 0.948318246854599089523674138036}, + {0.315865745062184066771493462511, 0.948803894962658378453568275290}, + {0.314409927055336824164299969198, 0.949287310443502008183713769540}, + {0.312953369211560195051191612947, 0.949768492159606680935723943549}, + {0.311496074958275970256948994574, 0.950247438978705227796694998688}, + {0.310038047724637999547070421613, 0.950724149773789606321372502862}, + {0.308579290941525030689263076056, 0.951198623423113232000503103336}, + {0.307119808041533104425724332032, 0.951670858810193864840698552143}, + {0.305659602458966228599734904492, 0.952140854823815829810484956397}, + {0.304198677629829272728301248208, 0.952608610358033236487074191245}, + {0.302737036991819141729109787775, 0.953074124312172199502413150185}, + {0.301274683984318003560076704161, 0.953537395590833281033837920404}, + {0.299811622048383463745580002069, 0.953998423103894488406240270706}, + {0.298347854626741570971404371448, 0.954457205766513494538116901822}, + {0.296883385163778268367451573795, 0.954913742499130524521433471818}, + {0.295418217105532066035777916113, 0.955368032227470243000766458863}, + {0.293952353899684770688338630862, 0.955820073882545417909284424240}, + {0.292485798995553825108117962372, 0.956269866400658141714075100026}, + {0.291018555844085091699469103332, 0.956717408723403051062916802039}, + {0.289550627897843138036648724665, 0.957162699797670102341839992732}, + {0.288082018611004297969913068300, 0.957605738575646237009664218931}, + {0.286612731439347789841320945925, 0.958046524014818601244769524783}, + {0.285142769840248722079678600494, 0.958485055077976100257330926979}, + {0.283672137272668545282527929885, 0.958921330733213062025299677771}, + {0.282200837197147502699579035834, 0.959355349953930791606637740188}, + {0.280728873075797191738445235387, 0.959787111718839902607669500867}, + {0.279256248372291238091236209584, 0.960216615011963425807550720492}, + {0.277782966551857801729141783653, 0.960643858822638474492805471527}, + {0.276309031081271028185142313305, 0.961068842145519353081795088656}, + {0.274834445428843943126651083730, 0.961491563980579000414650181483}, + {0.273359213064418793415200070740, 0.961912023333112098377739584976}, + {0.271883337459359886167931108503, 0.962330219213737403372022072290}, + {0.270406822086544817995701350810, 0.962746150638399411647583292506}, + {0.268929670420357314064574438817, 0.963159816628371356905802258552}, + {0.267451885936677735688959955951, 0.963571216210257208700795672485}, + {0.265973472112875530815045976851, 0.963980348415994114930072100833}, + {0.264494432427801628993080385044, 0.964387212282854289213673837367}, + {0.263014770361779059992812790369, 0.964791806853447897474040928500}, + {0.261534489396595626331532002951, 0.965194131175724723270548111032}, + {0.260053593015495132512171494454, 0.965594184302976832334763912513}, + {0.258572084703170390618254259607, 0.965991965293840570971894976537}, + {0.257089967945753228306671189785, 0.966387473212298786506835313048}, + {0.255607246230807549913777165784, 0.966780707127683269774820473685}, + {0.254123923047320621204647750346, 0.967171666114676642500569414551}, + {0.252640001885695575367662968347, 0.967560349253314355699728821492}, + {0.251155486237742031629949224225, 0.967946755628987798303342060535}, + {0.249670379596668517985236235290, 0.968330884332445296358571340534}, + {0.248184685457074782899411502513, 0.968712734459794777563956813538}, + {0.246698407314942497192689074836, 0.969092305112506102737768287625}, + {0.245211548667627676767466482488, 0.969469595397412953197147089668}, + {0.243724113013852133891035123270, 0.969844604426714829159550390614}, + {0.242236103853696038701315274011, 0.970217331317979159166497993283}, + {0.240747524688588537822298007995, 0.970587775194143631551924045198}, + {0.239258379021300121580750897010, 0.970955935183517970799016438832}, + {0.237768670355934214066806475785, 0.971321810419786157986266061926}, + {0.236278402197919623617394790926, 0.971685400042008540211213585280}, + {0.234787578054001078164958471461, 0.972046703194623495924986400496}, + {0.233296201432231564698582815254, 0.972405719027449766400650332798}, + {0.231804275841964779747428337942, 0.972762446695688565156956428837}, + {0.230311804793845525951567765333, 0.973116885359925132270575431903}, + {0.228818791799802356834447891742, 0.973469034186130954822147032246}, + {0.227325240373038833796570656887, 0.973818892345666098364631579898}, + {0.225831154028026198643530619847, 0.974166459015280317146334709832}, + {0.224336536280493686890125104583, 0.974511733377115718646166442340}, + {0.222841390647421283555118520781, 0.974854714618708428908178120764}, + {0.221345720647030813621469746977, 0.975195401932990368898401811748}, + {0.219849529798778753342247682667, 0.975533794518291363928597093036}, + {0.218352821623346432522438931301, 0.975869891578341031035392916237}, + {0.216855599642632568269107196102, 0.976203692322270555337127007078}, + {0.215357867379745548941372135232, 0.976535195964614466390685265651}, + {0.213859628358993830721246354187, 0.976864401725312636592946091696}, + {0.212360886105878582386097264134, 0.977191308829712279582224709884}, + {0.210861644147084831280025696287, 0.977515916508569282505902720004}, + {0.209361906010474191353054607134, 0.977838223998050426466477347276}, + {0.207861675225075148709663608315, 0.978158230539735051856098380085}, + {0.206360955321075678625675209332, 0.978475935380616834713407570234}, + {0.204859749829814419275209047555, 0.978791337773105674102680495707}, + {0.203358062283773372014294977816, 0.979104436975029246426061035891}, + {0.201855896216568159173831986664, 0.979415232249634781780400771822}, + {0.200353255162940419031869510036, 0.979723722865591173381005773990}, + {0.198850142658750117519161904056, 0.980029908096989976762358764972}, + {0.197346562240966000301156668684, 0.980333787223347963291075757297}, + {0.195842517447657987750275765393, 0.980635359529608119366628216085}, + {0.194338011817988598473050387838, 0.980934624306141644822787384328}, + {0.192833048892205288771251048274, 0.981231580848749729284463683143}, + {0.191327632211630987990602648097, 0.981526228458664662390731336927}, + {0.189821765318656576759792642406, 0.981818566442552498330087473732}, + {0.188315451756732116228576501271, 0.982108594112513610951964437845}, + {0.186808695070359326306785874294, 0.982396310786084692168174115068}, + {0.185301498805082009990741198635, 0.982681715786240861376654720516}, + {0.183793866507478392824381785431, 0.982964808441396442617588036228}, + {0.182285801725153323582517828072, 0.983245588085407073997146198963}, + {0.180777308006728670841667394598, 0.983524054057571261999726175418}, + {0.179268388901835884485791439147, 0.983800205702631491710974387388}, + {0.177759047961107141677672416336, 0.984074042370776447263835962076}, + {0.176249288736167936120224908336, 0.984345563417641900016974432219}, + {0.174739114779627308093878923501, 0.984614768204312595933913598856}, + {0.173228529645070489229041754697, 0.984881656097323698872969544027}, + {0.171717536887049965210749746802, 0.985146226468662233877182643482}, + {0.170206140061078120551130155036, 0.985408478695768419441947116866}, + {0.168694342723617440871208827957, 0.985668412161537554894152890483}, + {0.167182148432072880117615909512, 0.985926026254321130615210222459}, + {0.165669560744784144512564694196, 0.986181320367928271330981715437}, + {0.164156583221015894835659310047, 0.986434293901627068379411866772}, + {0.162643219420950446707507808242, 0.986684946260146689134273856325}, + {0.161129472905678777783222699327, 0.986933276853677710072076934011}, + {0.159615347237193089258155964671, 0.987179285097874337218115670112}, + {0.158100845978377091416433586346, 0.987422970413855405347192117915}, + {0.156585972692998592892266174204, 0.987664332228205710251245363906}, + {0.155070730945700507863449502111, 0.987903369972977785096190928016}, + {0.153555124301993500823826366286, 0.988140083085692566555735538714}, + {0.152039156328246161109518652665, 0.988374471009341282190518995776}, + {0.150522830591677370115633038949, 0.988606533192386449648836332926}, + {0.149006150660348474223937387251, 0.988836269088763542001174755569}, + {0.147489120103153681373697736490, 0.989063678157881542851725953369}, + {0.145971742489812372767232773185, 0.989288759864625166784435350564}, + {0.144454021390860443130321755234, 0.989511513679355192429909493512}, + {0.142935960377642695684485829588, 0.989731939077910571889162838488}, + {0.141417563022303127695522562135, 0.989950035541608985845130064263}, + {0.139898832897777380956938486634, 0.990165802557248397874900547322}, + {0.138379773577783887761327719090, 0.990379239617108164672742987023}, + {0.136860388636816432406106969211, 0.990590346218950146273130030750}, + {0.135340681650134325719747607764, 0.990799121866020371385275211651}, + {0.133820656193754689011754521744, 0.991005566067049370460040336184}, + {0.132300315844444682511493738275, 0.991209678336254063069077346881}, + {0.130779664179711790916726954492, 0.991411458193338535060945559962}, + {0.129258704777796273877044086476, 0.991610905163495370828741215519}, + {0.127737441217662284209666267998, 0.991808018777406430466214715125}, + {0.126215877078990401649605246348, 0.992002798571244515102307559573}, + {0.124694015942167765742532026252, 0.992195244086673922012664661452}, + {0.123171861388280651228299689137, 0.992385354870851665864961432817}, + {0.121649416999105544623382968439, 0.992573130476428810986533335381}, + {0.120126686357101580826522990719, 0.992758570461551137498190655606}, + {0.118603673045400842545049613364, 0.992941674389860473581848054891}, + {0.117080380647800547100345625040, 0.993122441830495583658944269700}, + {0.115556812748755288744462177419, 0.993300872358093278613466736715}, + {0.114032972933367296453077699425, 0.993476965552789192948068830447}, + {0.112508864787378828897779214913, 0.993650721000219117051699413423}, + {0.110984491897163375928592188302, 0.993822138291519663333417611284}, + {0.109459857849718025790686226628, 0.993991217023329376445417437935}, + {0.107934966232653764550697417235, 0.994157956797789732483749958192}, + {0.106409820634187843313434029824, 0.994322357222545805122138062870}, + {0.104884424643134965826618554274, 0.994484417910747597879606018978}, + {0.103358781848899697330956826136, 0.994644138481050710254294244805}, + {0.101832895841466666841945709621, 0.994801518557617114879576547537}, + {0.100306770211392823344276337139, 0.994956557770116378769387210923}, + {0.098780408549799664230661733200, 0.995109255753726107407430845342}, + {0.097253814448363354316917650522, 0.995259612149133388037114400504}, + {0.095726991499307315103273197110, 0.995407626602534900683849627967}, + {0.094199943295393190334507949046, 0.995553298765638472467287556356}, + {0.092672673429913365872323538497, 0.995696628295663521690528341423}, + {0.091145185496681130343787913262, 0.995837614855341612951633578632}, + {0.089617483090022917457950768494, 0.995976258112917789411255853338}, + {0.088089569804770506689095554975, 0.996112557742151127904151053372}, + {0.086561449236251239436334969923, 0.996246513422315516095295606647}, + {0.085033124980280413995892274670, 0.996378124838200207591398793738}, + {0.083504600633152403776904293409, 0.996507391680110821141624910524}, + {0.081975879791633107784853962130, 0.996634313643869895749105580762}, + {0.080446966052950097392226780357, 0.996758890430818000893964381248}, + {0.078917863014785094577518975711, 0.996881121747813847555619304330}, + {0.077388574275265048507677079215, 0.997001007307235287413504920551}, + {0.075859103432954502754803627340, 0.997118546826979978980887153739}, + {0.074329454086845866966903884077, 0.997233740030466164760980518622}, + {0.072799629836351617551137849205, 0.997346586646633226358460433403}, + {0.071269634281296415090345419685, 0.997457086409941906524068144790}, + {0.069739471021907376013793111724, 0.997565239060375752444542740704}, + {0.068209143658806453691667570638, 0.997671044343441004720318687760}, + {0.066678655793001542773090761784, 0.997774502010167818610852918937}, + {0.065148011025878860280613480427, 0.997875611817110153012322371069}, + {0.063617212959193189525386458172, 0.997974373526346991702951072511}, + {0.062086265195060247323866065017, 0.998070786905482343343010143144}, + {0.060555171335947781396935596376, 0.998164851727646240675539957010}, + {0.059023934984667986158868302482, 0.998256567771495184615559992380}, + {0.057492559744367684182453359654, 0.998345934821212366294673756784}, + {0.055961049218520519943353974668, 0.998432952666508444217186024616}, + {0.054429407010919146625571585218, 0.998517621102622210393917612237}, + {0.052897636725665400647677927282, 0.998599939930320368297600452934}, + {0.051365741967162731329565872329, 0.998679908955899087175112072146}, + {0.049833726340107256658207290911, 0.998757527991183335913660812366}, + {0.048301593449480172137722178149, 0.998832796853527993263810458302}, + {0.046769346900537960010080240636, 0.998905715365818291928690086934}, + {0.045236990298804749532912694576, 0.998976283356469818563994067517}, + {0.043704527250063421317527456722, 0.999044500659429290934099299193}, + {0.042171961360348002301190462049, 0.999110367114174890978972598532}, + {0.040639296235933854151145538935, 0.999173882565716375836473162053}, + {0.039106535483329839253396897902, 0.999235046864595854998469803832}, + {0.037573682709270514457067235981, 0.999293859866887790310840955499}, + {0.036040741520706298661735900168, 0.999350321434199440062684516306}, + {0.034507715524795888606401916832, 0.999404431433671303075527703186}, + {0.032974608328897314635241855285, 0.999456189737977340747931975784}, + {0.031441423540560342608785049379, 0.999505596225325310122400424007}, + {0.029908164767516655369039568768, 0.999552650779456985929982693051}, + {0.028374835617672258120114392455, 0.999597353289648382634879908437}, + {0.026841439699098527255083368459, 0.999639703650710198523654526070}, + {0.025307980620024629614395195176, 0.999679701762987926727532794757}, + {0.023774461988827676195423777017, 0.999717347532362188289312143752}, + {0.022240887414024919366273280730, 0.999752640870248843185663645272}, + {0.020707260504265911915666720233, 0.999785581693599212371736939531}, + {0.019173584868322698926412783749, 0.999816169924900410848067622283}, + {0.017639864115082195400452391709, 0.999844405492175236638274782308}, + {0.016106101853537262841298272065, 0.999870288328982947945178239024}, + {0.014572301692779104226316277959, 0.999893818374418485994681304874}, + {0.013038467241987433328787027165, 0.999914995573113474236492947966}, + {0.011504602110422874894357647690, 0.999933819875235996299522867048}, + {0.009970709907418029080417021248, 0.999950291236490484969579028984}, + {0.008436794242369859489483197024, 0.999964409618118277300879981340}, + {0.006902858724729877236414576913, 0.999976174986897614616054852377}, + {0.005368906963996302600383714321, 0.999985587315143198416933500994}, + {0.003834942569706247927213693671, 0.999992646580707189585268679366}, + {0.002300969151425886517758900851, 0.999997352766978209182013870304}, + {0.000766990318742846407563951150, 0.999999705862882226625742987380}, + {-0.000766990318742723892718460288, 0.999999705862882226625742987380}, + {-0.002300969151425763786072975492, 0.999997352766978209182013870304}, + {-0.003834942569706125629208637307, 0.999992646580707189585268679366}, + {-0.005368906963996180302378657956, 0.999985587315143198416933500994}, + {-0.006902858724729754071047782560, 0.999976174986897614616054852377}, + {-0.008436794242369738058839878647, 0.999964409618118277300879981340}, + {-0.009970709907417905915050226895, 0.999950291236490484969579028984}, + {-0.011504602110422753463714329314, 0.999933819875235996299522867048}, + {-0.013038467241987310163420232811, 0.999914995573113474236492947966}, + {-0.014572301692778981060949483606, 0.999893818374418485994681304874}, + {-0.016106101853537141410654953688, 0.999870288328982947945178239024}, + {-0.017639864115082073969809073333, 0.999844405492175236638274782308}, + {-0.019173584868322577495769465372, 0.999816169924900410848067622283}, + {-0.020707260504265790485023401857, 0.999785581693599212371736939531}, + {-0.022240887414024794466183010400, 0.999752640870248843185663645272}, + {-0.023774461988827551295333506687, 0.999717347532362188289312143752}, + {-0.025307980620024504714304924846, 0.999679701762987926727532794757}, + {-0.026841439699098405824440050083, 0.999639703650710198523654526070}, + {-0.028374835617672133220024122124, 0.999597353289648382634879908437}, + {-0.029908164767516533938396250392, 0.999552650779456985929982693051}, + {-0.031441423540560217708694779049, 0.999505596225325310122400424007}, + {-0.032974608328897189735151584955, 0.999456189737977340747931975784}, + {-0.034507715524795770645205550409, 0.999404431433671303075527703186}, + {-0.036040741520706180700539533746, 0.999350321434199440062684516306}, + {-0.037573682709270396495870869558, 0.999293859866887790310840955499}, + {-0.039106535483329721292200531479, 0.999235046864595854998469803832}, + {-0.040639296235933729251055268605, 0.999173882565716375836473162053}, + {-0.042171961360347877401100191719, 0.999110367114174890978972598532}, + {-0.043704527250063296417437186392, 0.999044500659429290934099299193}, + {-0.045236990298804624632822424246, 0.998976283356469818563994067517}, + {-0.046769346900537835109989970306, 0.998905715365818291928690086934}, + {-0.048301593449480054176525811727, 0.998832796853527993263810458302}, + {-0.049833726340107131758117020581, 0.998757527991183335913660812366}, + {-0.051365741967162606429475601999, 0.998679908955899087175112072146}, + {-0.052897636725665275747587656952, 0.998599939930320368297600452934}, + {-0.054429407010919021725481314888, 0.998517621102622210393917612237}, + {-0.055961049218520401982157608245, 0.998432952666508444217186024616}, + {-0.057492559744367566221256993231, 0.998345934821212366294673756784}, + {-0.059023934984667861258778032152, 0.998256567771495184615559992380}, + {-0.060555171335947656496845326046, 0.998164851727646240675539957010}, + {-0.062086265195060122423775794687, 0.998070786905482343343010143144}, + {-0.063617212959193064625296187842, 0.997974373526346991702951072511}, + {-0.065148011025878735380523210097, 0.997875611817110153012322371069}, + {-0.066678655793001417873000491454, 0.997774502010167818610852918937}, + {-0.068209143658806328791577300308, 0.997671044343441004720318687760}, + {-0.069739471021907251113702841394, 0.997565239060375752444542740704}, + {-0.071269634281296290190255149355, 0.997457086409941906524068144790}, + {-0.072799629836351492651047578875, 0.997346586646633226358460433403}, + {-0.074329454086845755944601421561, 0.997233740030466275783282981138}, + {-0.075859103432954377854713357010, 0.997118546826979978980887153739}, + {-0.077388574275264923607586808885, 0.997001007307235287413504920551}, + {-0.078917863014784983555216513196, 0.996881121747813847555619304330}, + {-0.080446966052949972492136510027, 0.996758890430818000893964381248}, + {-0.081975879791632982884763691800, 0.996634313643869895749105580762}, + {-0.083504600633152278876814023079, 0.996507391680110821141624910524}, + {-0.085033124980280289095802004340, 0.996378124838200207591398793738}, + {-0.086561449236251114536244699593, 0.996246513422315516095295606647}, + {-0.088089569804770381789005284645, 0.996112557742151238926453515887}, + {-0.089617483090022792557860498164, 0.995976258112917789411255853338}, + {-0.091145185496681005443697642932, 0.995837614855341612951633578632}, + {-0.092672673429913240972233268167, 0.995696628295663521690528341423}, + {-0.094199943295393079312205486531, 0.995553298765638583489590018871}, + {-0.095726991499307190203182926780, 0.995407626602534900683849627967}, + {-0.097253814448363243294615188006, 0.995259612149133388037114400504}, + {-0.098780408549799539330571462870, 0.995109255753726107407430845342}, + {-0.100306770211392712321973874623, 0.994956557770116378769387210923}, + {-0.101832895841466541941855439291, 0.994801518557617114879576547537}, + {-0.103358781848899572430866555806, 0.994644138481050710254294244805}, + {-0.104884424643134840926528283944, 0.994484417910747597879606018978}, + {-0.106409820634187718413343759494, 0.994322357222545805122138062870}, + {-0.107934966232653639650607146905, 0.994157956797789732483749958192}, + {-0.109459857849717914768383764113, 0.993991217023329376445417437935}, + {-0.110984491897163251028501917972, 0.993822138291519663333417611284}, + {-0.112508864787378703997688944582, 0.993650721000219117051699413423}, + {-0.114032972933367171552987429095, 0.993476965552789192948068830447}, + {-0.115556812748755177722159714904, 0.993300872358093278613466736715}, + {-0.117080380647800422200255354710, 0.993122441830495583658944269700}, + {-0.118603673045400717644959343033, 0.992941674389860473581848054891}, + {-0.120126686357101455926432720389, 0.992758570461551137498190655606}, + {-0.121649416999105419723292698109, 0.992573130476428810986533335381}, + {-0.123171861388280526328209418807, 0.992385354870851665864961432817}, + {-0.124694015942167640842441755922, 0.992195244086673922012664661452}, + {-0.126215877078990262871727168204, 0.992002798571244515102307559573}, + {-0.127737441217662173187363805482, 0.991808018777406541488517177640}, + {-0.129258704777796162854741623960, 0.991610905163495370828741215519}, + {-0.130779664179711679894424491977, 0.991411458193338535060945559962}, + {-0.132300315844444571489191275759, 0.991209678336254063069077346881}, + {-0.133820656193754577989452059228, 0.991005566067049370460040336184}, + {-0.135340681650134214697445145248, 0.990799121866020371385275211651}, + {-0.136860388636816321383804506695, 0.990590346218950146273130030750}, + {-0.138379773577783776739025256575, 0.990379239617108164672742987023}, + {-0.139898832897777242179060408489, 0.990165802557248397874900547322}, + {-0.141417563022303016673220099619, 0.989950035541608985845130064263}, + {-0.142935960377642584662183367072, 0.989731939077910571889162838488}, + {-0.144454021390860332108019292718, 0.989511513679355303452211956028}, + {-0.145971742489812233989354695041, 0.989288759864625166784435350564}, + {-0.147489120103153542595819658345, 0.989063678157881542851725953369}, + {-0.149006150660348363201634924735, 0.988836269088763542001174755569}, + {-0.150522830591677259093330576434, 0.988606533192386560671138795442}, + {-0.152039156328246050087216190150, 0.988374471009341282190518995776}, + {-0.153555124301993389801523903770, 0.988140083085692566555735538714}, + {-0.155070730945700396841147039595, 0.987903369972977785096190928016}, + {-0.156585972692998481869963711688, 0.987664332228205710251245363906}, + {-0.158100845978376980394131123830, 0.987422970413855405347192117915}, + {-0.159615347237192950480277886527, 0.987179285097874337218115670112}, + {-0.161129472905678666760920236811, 0.986933276853677821094379396527}, + {-0.162643219420950335685205345726, 0.986684946260146689134273856325}, + {-0.164156583221015783813356847531, 0.986434293901627179401714329288}, + {-0.165669560744784005734686616051, 0.986181320367928271330981715437}, + {-0.167182148432072769095313446996, 0.985926026254321130615210222459}, + {-0.168694342723617329848906365442, 0.985668412161537554894152890483}, + {-0.170206140061078009528827692520, 0.985408478695768419441947116866}, + {-0.171717536887049854188447284287, 0.985146226468662233877182643482}, + {-0.173228529645070350451163676553, 0.984881656097323698872969544027}, + {-0.174739114779627197071576460985, 0.984614768204312595933913598856}, + {-0.176249288736167797342346830192, 0.984345563417641900016974432219}, + {-0.177759047961107030655369953820, 0.984074042370776558286138424592}, + {-0.179268388901835745707913361002, 0.983800205702631602733276849904}, + {-0.180777308006728559819364932082, 0.983524054057571261999726175418}, + {-0.182285801725153212560215365556, 0.983245588085407185019448661478}, + {-0.183793866507478281802079322915, 0.982964808441396442617588036228}, + {-0.185301498805081898968438736119, 0.982681715786240861376654720516}, + {-0.186808695070359215284483411779, 0.982396310786084692168174115068}, + {-0.188315451756732005206274038756, 0.982108594112513610951964437845}, + {-0.189821765318656465737490179890, 0.981818566442552498330087473732}, + {-0.191327632211630876968300185581, 0.981526228458664773413033799443}, + {-0.192833048892205149993372970130, 0.981231580848749729284463683143}, + {-0.194338011817988459695172309694, 0.980934624306141755845089846844}, + {-0.195842517447657876727973302877, 0.980635359529608119366628216085}, + {-0.197346562240965889278854206168, 0.980333787223347963291075757297}, + {-0.198850142658750006496859441540, 0.980029908096990087784661227488}, + {-0.200353255162940280253991431891, 0.979723722865591173381005773990}, + {-0.201855896216568020395953908519, 0.979415232249634781780400771822}, + {-0.203358062283773260991992515301, 0.979104436975029246426061035891}, + {-0.204859749829814308252906585039, 0.978791337773105674102680495707}, + {-0.206360955321075567603372746817, 0.978475935380616834713407570234}, + {-0.207861675225075037687361145800, 0.978158230539735051856098380085}, + {-0.209361906010474080330752144619, 0.977838223998050426466477347276}, + {-0.210861644147084720257723233772, 0.977515916508569282505902720004}, + {-0.212360886105878443608219185990, 0.977191308829712279582224709884}, + {-0.213859628358993719698943891672, 0.976864401725312636592946091696}, + {-0.215357867379745437919069672716, 0.976535195964614466390685265651}, + {-0.216855599642632457246804733586, 0.976203692322270555337127007078}, + {-0.218352821623346321500136468785, 0.975869891578341031035392916237}, + {-0.219849529798778642319945220152, 0.975533794518291363928597093036}, + {-0.221345720647030702599167284461, 0.975195401932990368898401811748}, + {-0.222841390647421172532816058265, 0.974854714618708428908178120764}, + {-0.224336536280493575867822642067, 0.974511733377115829668468904856}, + {-0.225831154028026087621228157332, 0.974166459015280428168637172348}, + {-0.227325240373038722774268194371, 0.973818892345666209386934042413}, + {-0.228818791799802245812145429227, 0.973469034186131065844449494762}, + {-0.230311804793845414929265302817, 0.973116885359925132270575431903}, + {-0.231804275841964640969550259797, 0.972762446695688565156956428837}, + {-0.233296201432231425920704737109, 0.972405719027449877422952795314}, + {-0.234787578054000939387080393317, 0.972046703194623495924986400496}, + {-0.236278402197919484839516712782, 0.971685400042008540211213585280}, + {-0.237768670355934075288928397640, 0.971321810419786269008568524441}, + {-0.239258379021299982802872818866, 0.970955935183517970799016438832}, + {-0.240747524688588399044419929851, 0.970587775194143631551924045198}, + {-0.242236103853695927679012811495, 0.970217331317979159166497993283}, + {-0.243724113013852022868732660754, 0.969844604426714940181852853129}, + {-0.245211548667627565745164019972, 0.969469595397413064219449552184}, + {-0.246698407314942386170386612321, 0.969092305112506213760070750141}, + {-0.248184685457074671877109039997, 0.968712734459794777563956813538}, + {-0.249670379596668379207358157146, 0.968330884332445296358571340534}, + {-0.251155486237741920607646761709, 0.967946755628987798303342060535}, + {-0.252640001885695464345360505831, 0.967560349253314466722031284007}, + {-0.254123923047320510182345287831, 0.967171666114676642500569414551}, + {-0.255607246230807438891474703269, 0.966780707127683269774820473685}, + {-0.257089967945753117284368727269, 0.966387473212298897529137775564}, + {-0.258572084703170279595951797091, 0.965991965293840570971894976537}, + {-0.260053593015495021489869031939, 0.965594184302976832334763912513}, + {-0.261534489396595515309229540435, 0.965194131175724723270548111032}, + {-0.263014770361778948970510327854, 0.964791806853447897474040928500}, + {-0.264494432427801517970777922528, 0.964387212282854289213673837367}, + {-0.265973472112875419792743514336, 0.963980348415994114930072100833}, + {-0.267451885936677624666657493435, 0.963571216210257319723098135000}, + {-0.268929670420357203042271976301, 0.963159816628371467928104721068}, + {-0.270406822086544706973398888294, 0.962746150638399411647583292506}, + {-0.271883337459359775145628645987, 0.962330219213737403372022072290}, + {-0.273359213064418682392897608224, 0.961912023333112209400042047491}, + {-0.274834445428843832104348621215, 0.961491563980579000414650181483}, + {-0.276309031081270917162839850789, 0.961068842145519353081795088656}, + {-0.277782966551857635195688089880, 0.960643858822638585515107934043}, + {-0.279256248372291127068933747069, 0.960216615011963425807550720492}, + {-0.280728873075797080716142772872, 0.959787111718840013629971963383}, + {-0.282200837197147391677276573319, 0.959355349953930791606637740188}, + {-0.283672137272668434260225467369, 0.958921330733213173047602140286}, + {-0.285142769840248611057376137978, 0.958485055077976211279633389495}, + {-0.286612731439347678819018483409, 0.958046524014818601244769524783}, + {-0.288082018611004186947610605785, 0.957605738575646348031966681447}, + {-0.289550627897843027014346262149, 0.957162699797670213364142455248}, + {-0.291018555844084980677166640817, 0.956717408723403162085219264554}, + {-0.292485798995553714085815499857, 0.956269866400658141714075100026}, + {-0.293952353899684659666036168346, 0.955820073882545417909284424240}, + {-0.295418217105531955013475453597, 0.955368032227470354023068921379}, + {-0.296883385163778157345149111279, 0.954913742499130524521433471818}, + {-0.298347854626741459949101908933, 0.954457205766513494538116901822}, + {-0.299811622048383352723277539553, 0.953998423103894488406240270706}, + {-0.301274683984317892537774241646, 0.953537395590833392056140382920}, + {-0.302737036991819030706807325259, 0.953074124312172310524715612701}, + {-0.304198677629829161705998785692, 0.952608610358033236487074191245}, + {-0.305659602458966117577432441976, 0.952140854823815829810484956397}, + {-0.307119808041532993403421869516, 0.951670858810193864840698552143}, + {-0.308579290941524919666960613540, 0.951198623423113343022805565852}, + {-0.310038047724637888524767959098, 0.950724149773789606321372502862}, + {-0.311496074958275859234646532059, 0.950247438978705227796694998688}, + {-0.312953369211560084028889150431, 0.949768492159606680935723943549}, + {-0.314409927055336713141997506682, 0.949287310443502008183713769540}, + {-0.315865745062183955749190999995, 0.948803894962658489475870737806}, + {-0.317320819806421683395569743880, 0.948318246854599200545976600552}, + {-0.318775147864118368890018473394, 0.947830367262101125547246738279}, + {-0.320228725813099912578252315143, 0.947340257333192048427861209348}, + {-0.321681550232956525725569463248, 0.946847918221147999418008112116}, + {-0.323133617705052222923711724434, 0.946353351084490590494624484563}, + {-0.324584924812532038540524581549, 0.945856557086983906756927353854}, + {-0.326035468140330242370339419722, 0.945357537397632285980364486022}, + {-0.327485244275177944661692208683, 0.944856293190677209992145435535}, + {-0.328934249805612088923822966535, 0.944352825645594862180587369949}, + {-0.330382481321982779398638285784, 0.943847135947092685803738731920}, + {-0.331829935416461108133034940693, 0.943339225285107718654842301476}, + {-0.333276608683047814718491963504, 0.942829094854802707281749007961}, + {-0.334722497717581113363394251792, 0.942316745856563775518566217215}, + {-0.336167599117744575476507407075, 0.941802179495997648928096168675}, + {-0.337611909483074568161242723363, 0.941285396983928768221971949970}, + {-0.339055425414969524577912807217, 0.940766399536396069613886083971}, + {-0.340498143516696993859937947491, 0.940245188374650875395843740989}, + {-0.341940060393402189831135729037, 0.939721764725153341224483938277}, + {-0.343381172652114985410776171193, 0.939196129819569902608122902166}, + {-0.344821476901759182975837347840, 0.938668284894770277304587580147}, + {-0.346260969753160063877572838464, 0.938138231192824356696746690432}, + {-0.347699647819051327335415635389, 0.937605969960999985346461471636}, + {-0.349137507714084915910746076406, 0.937071502451759186236301957251}, + {-0.350574546054837454800434670688, 0.936534829922755607256590337784}, + {-0.352010759459819133621039100035, 0.935995953636831301558629547799}, + {-0.353446144549480756325010588625, 0.935454874862014729153258940642}, + {-0.354880697946222678496042135521, 0.934911594871516093974150862778}, + {-0.356314416274402245843333503217, 0.934366114943725900587878641090}, + {-0.357747296160341898829670981286, 0.933818436362210957391027932317}, + {-0.359179334232336444632238681152, 0.933268560415712045141845010221}, + {-0.360610527120662160971420462374, 0.932716488398140253224255502573}, + {-0.362040871457584234605064921197, 0.932162221608574426134907753294}, + {-0.363470363877363755733540529036, 0.931605761351257832814098946983}, + {-0.364899001016267210406596177563, 0.931047108935595280065911083511}, + {-0.366326779512573474928416317198, 0.930486265676149781889137102553}, + {-0.367753696006581975996851952004, 0.929923232892639672897416858177}, + {-0.369179747140619962664231934468, 0.929358011909935610717070630926}, + {-0.370604929559051554655013660522, 0.928790604058057023273420327314}, + {-0.372029239908284847793140670547, 0.928221010672169555277832841966}, + {-0.373452674836780296185878569304, 0.927649233092581182447133869573}, + {-0.374875230995057484584265239391, 0.927075272664740102079861117090}, + {-0.376296905035704676301122617588, 0.926499130739230514208770728146}, + {-0.377717693613385696593809370825, 0.925920808671769957065578182664}, + {-0.379137593384847315647334653477, 0.925340307823206309478791808942}, + {-0.380556601008928463425462496161, 0.924757629559513905093126595602}, + {-0.381974713146567113053464481709, 0.924172775251791200901152478764}, + {-0.383391926460808663001955665095, 0.923585746276256669418103228963}, + {-0.384808237616812820469647249411, 0.922996544014246356191222275811}, + {-0.386223643281862871745602205920, 0.922405169852209994019176519942}, + {-0.387638140125372565591987950029, 0.921811625181708116372192307608}, + {-0.389051724818894384405609798705, 0.921215911399408726722981555213}, + {-0.390464394036126538622966108960, 0.920618029907083967877667873836}, + {-0.391876144452922237082503897909, 0.920017982111606569262107768736}, + {-0.393286972747296459385069056225, 0.919415769424946960342026613944}, + {-0.394696875599433560921625030460, 0.918811393264170050976247239305}, + {-0.396105849691696210168601055557, 0.918204855051431012569196354889}, + {-0.397513891708632216559493599561, 0.917596156213972946602552838158}, + {-0.398920998336982912668702283554, 0.916985298184122998854661545920}, + {-0.400327166265690037594282557620, 0.916372282399289139753761901375}, + {-0.401732392185904896297898858393, 0.915757110301956833708914018644}, + {-0.403136672790995131965274822505, 0.915139783339685264351714977238}, + {-0.404540004776552997167726744010, 0.914520302965104447956434796652}, + {-0.405942384840402459289521175378, 0.913898670635911680726337635861}, + {-0.407343809682607860267467003723, 0.913274887814867764035398067790}, + {-0.408744276005481410596331670604, 0.912648955969793895803832128877}, + {-0.410143780513590239245047541772, 0.912020876573568339829023443599}, + {-0.411542319913765164418606445906, 0.911390651104122428982634573913}, + {-0.412939890915107910007719738132, 0.910758281044437567608440531330}, + {-0.414336490228999099194595601148, 0.910123767882541678808649976418}, + {-0.415732114569105304369145414967, 0.909487113111505429685621493263}, + {-0.417126760651387762379727064399, 0.908848318229439122717394639039}, + {-0.418520425194109757516258696342, 0.908207384739488698954801293439}, + {-0.419913104917843393870668933232, 0.907564314149832740419299170753}, + {-0.421304796545479587344118499459, 0.906919107973678140233175781759}, + {-0.422695496802233061650611034565, 0.906271767729257549106591795862}, + {-0.424085202415651396634643788275, 0.905622294939825378534692390531}, + {-0.425473910115623799033102159228, 0.904970691133653248883206288156}, + {-0.426861616634386598079231589509, 0.904316957844028213031606355798}, + {-0.428248318706531794219927178347, 0.903661096609248093436406179535}, + {-0.429634013069016384989140533435, 0.903003108972617152261364026344}, + {-0.431018696461166805899978271555, 0.902342996482444315020643443859}, + {-0.432402365624690032674948270142, 0.901680760692037730485992597096}, + {-0.433785017303678577249570480490, 0.901016403159702328196090093115}, + {-0.435166648244619036489666541456, 0.900349925448735710631353867939}, + {-0.436547255196401140509010474489, 0.899681329127424045388750073471}, + {-0.437926834910322970717544421859, 0.899010615769039067579626589577}, + {-0.439305384140099786094424416660, 0.898337786951834416093731761066}, + {-0.440682899641872904972217384056, 0.897662844259040859640208509518}, + {-0.442059378174214867573965648262, 0.896985789278863965279242620454}, + {-0.443434816498138317797383933794, 0.896306623604479657529964242713}, + {-0.444809211377104884999056366723, 0.895625348834030110545256775367}, + {-0.446182559577029791419988669077, 0.894941966570620861531892842322}, + {-0.447554857866292898904703179142, 0.894256478422316147813830866653}, + {-0.448926103015743316326791045867, 0.893568886002135909230048582685}, + {-0.450296291798708447906562923890, 0.892879190928051791331654385431}, + {-0.451665420991002430906036124725, 0.892187394822982593467486367445}, + {-0.453033487370931686744057742544, 0.891493499314791382204248293419}, + {-0.454400487719303414202443036629, 0.890797506036281605545923412137}, + {-0.455766418819434637743626126394, 0.890099416625192318974768568296}, + {-0.457131277457157092491968342074, 0.889399232724195520916055102134}, + {-0.458495060420826106017955225980, 0.888696955980891711845970348804}, + {-0.459857764501329535633544765005, 0.887992588047805564421821600263}, + {-0.461219386492092153773114659998, 0.887286130582383258946777004894}, + {-0.462579923189086694712557346065, 0.886577585246987043277044904244}, + {-0.463939371390838573017134649490, 0.885866953708892790331219657674}, + {-0.465297727898434376747616170178, 0.885154237640285224131275754189}, + {-0.466654989515530860266778745427, 0.884439438718253811977376699360}, + {-0.468011153048359884731866031871, 0.883722558624789544801103602367}, + {-0.469366215305737355389936737993, 0.883003599046780940362566525437}, + {-0.470720173099071603761700544055, 0.882282561676008714179886283091}, + {-0.472073023242368772223187534109, 0.881559448209143781127750116866}, + {-0.473424762552241418234189040959, 0.880834260347742037389195957076}, + {-0.474775387847917118566698491122, 0.880106999798240363652723772248}, + {-0.476124895951243354286219755522, 0.879377668271953405465524156170}, + {-0.477473283686697946848198625958, 0.878646267485068244162960127142}, + {-0.478820547881393943079331165791, 0.877912799158641843355610490107}, + {-0.480166685365088163894853323654, 0.877177265018596163947961485974}, + {-0.481511692970189808526981778414, 0.876439666795713723246308290982}, + {-0.482855567531765728084280908661, 0.875700006225634597356588528783}, + {-0.484198305887548863246649943903, 0.874958285048851758247678844782}, + {-0.485539904877946904004915040787, 0.874214505010706299792389017966}, + {-0.486880361346047452197893790071, 0.873468667861384884254505323042}, + {-0.488219672137626625740836061595, 0.872720775355914413218272329686}, + {-0.489557834101157440809259924208, 0.871970829254157808740899326949}, + {-0.490894844087814863353713690231, 0.871218831320811126772696297849}, + {-0.492230698951485967640451235638, 0.870464783325397672975043406041}, + {-0.493565395548774765721589119494, 0.869708687042265560229736820474}, + {-0.494898930739010978197001122680, 0.868950544250582490590772977157}, + {-0.496231301384258194353549242805, 0.868190356734331314392250078527}, + {-0.497562504349319201235601894950, 0.867428126282306921623899143015}, + {-0.498892536501744476851172294118, 0.866663854688111245927473191841}, + {-0.500221394711840572355754375167, 0.865897543750148823704648748389}, + {-0.501549075852675496633992224815, 0.865129195271623685492556887766}, + {-0.502875576800086765416608614032, 0.864358811060534026893265036051}, + {-0.504200894432690449598055693059, 0.863586392929667989726283394702}, + {-0.505525025631885172039403641975, 0.862811942696600553404095990118}, + {-0.506847967281863209798586922261, 0.862035462183687317683222772757}, + {-0.508169716269614601955595389882, 0.861256953218062171195867904316}, + {-0.509490269484936031396671296534, 0.860476417631632295446308944520}, + {-0.510809623820439040464691515808, 0.859693857261072724718076187855}, + {-0.512127776171554804918173431361, 0.858909273947823792560996025713}, + {-0.513444723436543237760076863196, 0.858122669538086246809882595699}, + {-0.514760462516501093865883831313, 0.857334045882815698469414655847}, + {-0.516074990315366743942604443873, 0.856543404837719846156574021734}, + {-0.517388303739928945290671435941, 0.855750748263253924186244603334}, + {-0.518700399699835057454322395643, 0.854956078024614929411484354205}, + {-0.520011275107595816180605652335, 0.854159395991738956688266171113}, + {-0.521320926878595547471206828050, 0.853360704039295536738052305736}, + {-0.522629351931096608474547338119, 0.852560004046684083434115564160}, + {-0.523936547186248380292283854942, 0.851757297898029230864835881221}, + {-0.525242509568094595451270834019, 0.850952587482175837330089507304}, + {-0.526547236003579444130195952312, 0.850145874692685210582965282811}, + {-0.527850723422555123676147559308, 0.849337161427830888982271062559}, + {-0.529152968757790609366509215761, 0.848526449590592757310503202461}, + {-0.530453968944976428367965581856, 0.847713741088654271216284996626}, + {-0.531753720922733208453792030923, 0.846899037834397350188453401643}, + {-0.533052221632619560587329488044, 0.846082341744896937463238373311}, + {-0.534349468019137185947897705773, 0.845263654741918446511306228786}, + {-0.535645457029740978960319353064, 0.844442978751910766632704508083}, + {-0.536940185614842913075506203313, 0.843620315706004042510812723776}, + {-0.538233650727821477666168448195, 0.842795667540004345141824160237}, + {-0.539525849325028894476474761177, 0.841969036194387787652715360309}, + {-0.540816778365796668737175423303, 0.841140423614298082810591949965}, + {-0.542106434812443804815984549350, 0.840309831749540880885263050004}, + {-0.543394815630284688801054926444, 0.839477262554578551601025537821}, + {-0.544681917787634639616101139836, 0.838642717988527186534497559478}, + {-0.545967738255817458536967023974, 0.837806200015151047999495403928}, + {-0.547252274009174088931217738718, 0.836967710602857017931910377229}, + {-0.548535522025067168172540732485, 0.836127251724692377443659552227}, + {-0.549817479283890797603362443624, 0.835284825358337479350723242533}, + {-0.551098142769075427516156651109, 0.834440433486103194660188364651}, + {-0.552377509467095850759221775661, 0.833594078094925361455125312204}, + {-0.553655576367479196342458180879, 0.832745761176359566846372217697}, + {-0.554932340462810369530188836507, 0.831895484726577594258856152010}, + {-0.556207798748739823402331694524, 0.831043250746362427427982311201}, + {-0.557481948223991552460176990280, 0.830189061241102366217603503173}, + {-0.558754785890368421696905443241, 0.829332918220788140040156122268}, + {-0.560026308752760271225668020634, 0.828474823700007245719234560966}, + {-0.561296513819151465796153388510, 0.827614779697938396374468084105}, + {-0.562565398100626667954315962561, 0.826752788238348523819354340958}, + {-0.563832958611378054492035971634, 0.825888851349586894379228851903}, + {-0.565099192368714087209013996471, 0.825022971064580223909956657735}, + {-0.566364096393063620737962082785, 0.824155149420828680995043669100}, + {-0.567627667707986116596430292702, 0.823285388460400224808211078198}, + {-0.568889903340175862034300280357, 0.822413690229926386265901783190}, + {-0.570150800319470185684167518048, 0.821540056780597716112879425054}, + {-0.571410355678857229122513672337, 0.820664490168157456650988024194}, + {-0.572668566454481275940224804799, 0.819786992452898877203892880061}, + {-0.573925429685650523303763748117, 0.818907565699659056868142670282}, + {-0.575180942414845186583249869727, 0.818026211977813444420348787389}, + {-0.576435101687721940244557572441, 0.817142933361272860715018850897}, + {-0.577687904553122688611210833187, 0.816257731928477503480223731458}, + {-0.578939348063081893336345729040, 0.815370609762391285180171962566}, + {-0.580189429272831458384018787910, 0.814481568950498835413043252629}, + {-0.581438145240810166924916302378, 0.813590611584798506505933346489}, + {-0.582685493028668455295360217860, 0.812697739761799486934990000009}, + {-0.583931469701276073536178046197, 0.811802955582515584076475079200}, + {-0.585176072326730301043085091806, 0.810906261152459784113943896955}, + {-0.586419297976360609503387877339, 0.810007658581641032391473800089}, + {-0.587661143724736545479458982300, 0.809107149984558349231633656018}, + {-0.588901606649675835036816806678, 0.808204737480194723708848414390}, + {-0.590140683832249046680828996614, 0.807300423192014338091837544198}, + {-0.591378372356787473940187283006, 0.806394209247956350594677132904}, + {-0.592614669310891128972684782639, 0.805486097780429122217071835621}, + {-0.593849571785433405501919423841, 0.804576090926307219142188387195}, + {-0.595083076874569849579188485222, 0.803664190826924196286995538685}, + {-0.596315181675743821720914183970, 0.802750399628069155610887719376}, + {-0.597545883289693047224488964275, 0.801834719479981417045166836033}, + {-0.598775178820458719997077423614, 0.800917152537344412266406834533}, + {-0.600003065375389166291597575764, 0.799997700959281798915867511823}, + {-0.601229540065148393424010464514, 0.799076366909352464595883702714}, + {-0.602454600003723750312190077238, 0.798153152555543865531717528938}, + {-0.603678242308430479390324308042, 0.797228060070268695902484523685}, + {-0.604900464099919710214692258887, 0.796301091630359225703728043300}, + {-0.606121262502186231024836615688, 0.795372249417061305543086291436}, + {-0.607340634642572596568754761392, 0.794441535616030813926613518561}, + {-0.608558577651779342154725327418, 0.793508952417326662853724883462}, + {-0.609775088663868425342684531643, 0.792574502015407578170425040298}, + {-0.610990164816271552616910867073, 0.791638186609125993342672700237}, + {-0.612203803249797950947197477944, 0.790700008401721610162837805547}, + {-0.613416001108638697658648197830, 0.789759969600818956259047354251}, + {-0.614626755540374825059757313284, 0.788818072418420390690130261646}, + {-0.615836063695984980981279477419, 0.787874319070900219763586846966}, + {-0.617043922729849869668328210537, 0.786928711779001699433422345464}, + {-0.618250329799760023341548276221, 0.785981252767830262939696694957}, + {-0.619455282066924017847497907496, 0.785031944266848080715703872556}, + {-0.620658776695971914350025144813, 0.784080788509870174607385706622}, + {-0.621860810854965251337489462458, 0.783127787735057423468276738276}, + {-0.623061381715401374492557806661, 0.782172944184912899423522958386}, + {-0.624260486452220542119562196604, 0.781216260106276205732456219266}, + {-0.625458122243814251817184413085, 0.780257737750316593405841558706}, + {-0.626654286272029459325949574122, 0.779297379372530185648315637081}, + {-0.627848975722176350089398511045, 0.778335187232733316520238986413}, + {-0.629042187783035888770655219560, 0.777371163595056313688758109492}, + {-0.630233919646864482189130285406, 0.776405310727940278781034066924}, + {-0.631424168509401639859390797938, 0.775437630904130648090699651220}, + {-0.632612931569877523507727801189, 0.774468126400670864306619023409}, + {-0.633800206031017054897347406950, 0.773496799498899267888418762595}, + {-0.634985989099049352724080108601, 0.772523652484441325505315489863}, + {-0.636170277983712173508479281736, 0.771548687647206299367041992809}, + {-0.637353069898258906000876322651, 0.770571907281380918952606862149}, + {-0.638534362059466675809460411983, 0.769593313685423052739054128324}, + {-0.639714151687640564247772090312, 0.768612909162058266510086923518}, + {-0.640892436006621157851270709216, 0.767630696018273495084827118262}, + {-0.642069212243792541983111732407, 0.766646676565310492001970033016}, + {-0.643244477630085964570127998741, 0.765660853118662387828408100177}, + {-0.644418229399988273797816873412, 0.764673227998067250865688038175}, + {-0.645590464791548801493092923920, 0.763683803527501869901072950597}, + {-0.646761181046383692994083958183, 0.762692582035178090471561063168}, + {-0.647930375409685344045840338367, 0.761699565853535376369620735204}, + {-0.649098045130225953514013781387, 0.760704757319236923862604271562}, + {-0.650264187460365739035239585064, 0.759708158773163555466112484282}, + {-0.651428799656059709377586841583, 0.758709772560407391672754329193}, + {-0.652591878976862549421866788180, 0.757709601030268076193863180379}, + {-0.653753422685935947633595333173, 0.756707646536245781554441691696}, + {-0.654913428050056034557258044515, 0.755703911436035991044946058537}, + {-0.656071892339617823708408650418, 0.754698398091524391695372742106}, + {-0.657228812828642428023329102871, 0.753691108868781434182437806157}, + {-0.658384186794785053464806878765, 0.752682046138055227402219315991}, + {-0.659538011519338440713511317881, 0.751671212273768651890293313045}, + {-0.660690284287242191041400474205, 0.750658609654510700082141738676}, + {-0.661841002387086874136912229005, 0.749644240663033478710985946236}, + {-0.662990163111121244554624354350, 0.748628107686245547469638950133}, + {-0.664137763755259902254124426690, 0.747610213115205257672357674892}, + {-0.665283801619087289402898477420, 0.746590559345117199541164154653}, + {-0.666428274005865128870595981425, 0.745569148775325540867697782232}, + {-0.667571178222540195790202233184, 0.744545983809307365675067558186}, + {-0.668712511579748203338624534808, 0.743521066854669010481870827789}, + {-0.669852271391820908164049797051, 0.742494400323139291941743067582}, + {-0.670990454976794215014024302945, 0.741465986630563289594419984496}, + {-0.672127059656411507404527583276, 0.740435828196898238040546402772}, + {-0.673262082756132973493379267893, 0.739403927446205866402806350379}, + {-0.674395521605139047771615423699, 0.738370286806648512545336870971}, + {-0.675527373536338404669265855773, 0.737334908710483016847092585522}, + {-0.676657635886374841938106783346, 0.736297795594053172685278241261}, + {-0.677786305995631499499154415389, 0.735258949897786839855484686268}, + {-0.678913381208238297936929939169, 0.734218374066188395055121418409}, + {-0.680038858872078932904514658730, 0.733176070547832847701386072004}, + {-0.681162736338795538060253420554, 0.732132041795361176994560992171}, + {-0.682285010963795457428204827011, 0.731086290265474447735982721497}, + {-0.683405680106258794914708687429, 0.730038818418926260811474548973}, + {-0.684524741129142078044367281109, 0.728989628720519533544575097039}, + {-0.685642191399187361788847283606, 0.727938723639098617113063482975}, + {-0.686758028286925892302861029748, 0.726886105647544966679163280787}, + {-0.687872249166685323373826577154, 0.725831777222770480051394770271}, + {-0.688984851416597043893830232264, 0.724775740845711391457939498650}, + {-0.690095832418599952617910275876, 0.723717999001323386565331929887}, + {-0.691205189558448340747531801753, 0.722658554178575829318731393869}, + {-0.692312920225718109179524617502, 0.721597408870443768336144785280}, + {-0.693419021813811875531996520294, 0.720534565573905161350865000713}, + {-0.694523491719965413437876122771, 0.719470026789933214672601025086}, + {-0.695626327345254868994572916563, 0.718403795023489721849330180703}, + {-0.696727526094600979611470847885, 0.717335872783521955042829176818}, + {-0.697827085376777178638008081180, 0.716266262582953228132964795805}, + {-0.698925002604414147278077962255, 0.715194966938680010137829867745}, + {-0.700021275194006142861269381683, 0.714121988371564930808688131947}, + {-0.701115900565918548359434225858, 0.713047329406429342135709248396}, + {-0.702208876144391869189576027566, 0.711970992572049987678894922283}, + {-0.703300199357548505574300179433, 0.710892980401151897140721303003}, + {-0.704389867637400413080683847511, 0.709813295430400947871873995609}, + {-0.705477878419852211244744921714, 0.708731940200400534202174185339}, + {-0.706564229144709399221824241977, 0.707648917255684462013221036614}, + {-0.707648917255684350990918574098, 0.706564229144709510244126704492}, + {-0.708731940200400423179871722823, 0.705477878419852322267047384230}, + {-0.709813295430400725827269070578, 0.704389867637400524102986310027}, + {-0.710892980401151675096116377972, 0.703300199357548727618905104464}, + {-0.711970992572049876656592459767, 0.702208876144391980211878490081}, + {-0.713047329406429231113406785880, 0.701115900565918770404039150890}, + {-0.714121988371564819786385669431, 0.700021275194006253883571844199}, + {-0.715194966938679899115527405229, 0.698925002604414258300380424771}, + {-0.716266262582953117110662333289, 0.697827085376777400682613006211}, + {-0.717335872783521844020526714303, 0.696727526094601090633773310401}, + {-0.718403795023489610827027718187, 0.695626327345254980016875379079}, + {-0.719470026789932992627996100055, 0.694523491719965524460178585286}, + {-0.720534565573905050328562538198, 0.693419021813812097576601445326}, + {-0.721597408870443657313842322765, 0.692312920225718331224129542534}, + {-0.722658554178575607274126468837, 0.691205189558448451769834264269}, + {-0.723717999001323275543029467372, 0.690095832418600063640212738392}, + {-0.724775740845711169413334573619, 0.688984851416597154916132694780}, + {-0.725831777222770369029092307755, 0.687872249166685545418431502185}, + {-0.726886105647544744634558355756, 0.686758028286926114347465954779}, + {-0.727938723639098506090761020459, 0.685642191399187583833452208637}, + {-0.728989628720519422522272634524, 0.684524741129142189066669743625}, + {-0.730038818418926038766869623942, 0.683405680106258905937011149945}, + {-0.731086290265474336713680258981, 0.682285010963795568450507289526}, + {-0.732132041795361065972258529655, 0.681162736338795649082555883069}, + {-0.733176070547832625656781146972, 0.680038858872079043926817121246}, + {-0.734218374066188284032818955893, 0.678913381208238408959232401685}, + {-0.735258949897786617810879761237, 0.677786305995631610521456877905}, + {-0.736297795594053061662975778745, 0.676657635886375063982711708377}, + {-0.737334908710482905824790123006, 0.675527373536338626713870780804}, + {-0.738370286806648401523034408456, 0.674395521605139158793917886214}, + {-0.739403927446205755380503887864, 0.673262082756133084515681730409}, + {-0.740435828196898127018243940256, 0.672127059656411729449132508307}, + {-0.741465986630563178572117521981, 0.670990454976794326036326765461}, + {-0.742494400323139180919440605066, 0.669852271391821019186352259567}, + {-0.743521066854668899459568365273, 0.668712511579748314360926997324}, + {-0.744545983809307254652765095670, 0.667571178222540417834807158215}, + {-0.745569148775325429845395319717, 0.666428274005865350915200906456}, + {-0.746590559345117088518861692137, 0.665283801619087400425200939935}, + {-0.747610213115205146650055212376, 0.664137763755260013276426889206}, + {-0.748628107686245325425034025102, 0.662990163111121466599229279382}, + {-0.749644240663033367688683483721, 0.661841002387086985159214691521}, + {-0.750658609654510589059839276160, 0.660690284287242413086005399236}, + {-0.751671212273768540867990850529, 0.659538011519338551735813780397}, + {-0.752682046138055116379916853475, 0.658384186794785275509411803796}, + {-0.753691108868781212137832881126, 0.657228812828642539045631565386}, + {-0.754698398091524280673070279590, 0.656071892339617934730711112934}, + {-0.755703911436035880022643596021, 0.654913428050056145579560507031}, + {-0.756707646536245670532139229181, 0.653753422685936169678200258204}, + {-0.757709601030267854149258255347, 0.652591878976862771466471713211}, + {-0.758709772560407280650451866677, 0.651428799656059820399889304099}, + {-0.759708158773163444443810021767, 0.650264187460365850057542047580}, + {-0.760704757319236812840301809047, 0.649098045130226175558618706418}, + {-0.761699565853535265347318272688, 0.647930375409685455068142800883}, + {-0.762692582035177979449258600653, 0.646761181046383804016386420699}, + {-0.763683803527501758878770488081, 0.645590464791548912515395386436}, + {-0.764673227998067139843385575659, 0.644418229399988384820119335927}, + {-0.765660853118662276806105637661, 0.643244477630086075592430461256}, + {-0.766646676565310380979667570500, 0.642069212243792653005414194922}, + {-0.767630696018273384062524655747, 0.640892436006621379895875634247}, + {-0.768612909162058155487784461002, 0.639714151687640675270074552827}, + {-0.769593313685422830694449203293, 0.638534362059466897854065337015}, + {-0.770571907281380807930304399633, 0.637353069898259128045481247682}, + {-0.771548687647206188344739530294, 0.636170277983712395553084206767}, + {-0.772523652484441214483013027348, 0.634985989099049574768685033632}, + {-0.773496799498899156866116300080, 0.633800206031017165919649869466}, + {-0.774468126400670753284316560894, 0.632612931569877634530030263704}, + {-0.775437630904130537068397188705, 0.631424168509401861903995722969}, + {-0.776405310727940167758731604408, 0.630233919646864704233735210437}, + {-0.777371163595056202666455646977, 0.629042187783036110815260144591}, + {-0.778335187232733205497936523898, 0.627848975722176572134003436076}, + {-0.779297379372530074626013174566, 0.626654286272029681370554499154}, + {-0.780257737750316482383539096190, 0.625458122243814362839486875600}, + {-0.781216260106276094710153756751, 0.624260486452220653141864659119}, + {-0.782172944184912788401220495871, 0.623061381715401485514860269177}, + {-0.783127787735057312445974275761, 0.621860810854965362359791924973}, + {-0.784080788509870063585083244106, 0.620658776695972025372327607329}, + {-0.785031944266847969693401410041, 0.619455282066924128869800370012}, + {-0.785981252767830151917394232441, 0.618250329799760245386153201252}, + {-0.786928711779001588411119882949, 0.617043922729849980690630673053}, + {-0.787874319070900108741284384450, 0.615836063695985092003581939935}, + {-0.788818072418420279667827799130, 0.614626755540375047104362238315}, + {-0.789759969600818845236744891736, 0.613416001108638808680950660346}, + {-0.790700008401721499140535343031, 0.612203803249798061969499940460}, + {-0.791638186609125882320370237721, 0.610990164816271663639213329589}, + {-0.792574502015407467148122577782, 0.609775088663868536364986994158}, + {-0.793508952417326551831422420946, 0.608558577651779564199330252450}, + {-0.794441535616030702904311056045, 0.607340634642572818613359686424}, + {-0.795372249417061194520783828921, 0.606121262502186342047139078204}, + {-0.796301091630359114681425580784, 0.604900464099919821236994721403}, + {-0.797228060070268584880182061170, 0.603678242308430590412626770558}, + {-0.798153152555543754509415066423, 0.602454600003723861334492539754}, + {-0.799076366909352353573581240198, 0.601229540065148504446312927030}, + {-0.799997700959281687893565049308, 0.600003065375389277313900038280}, + {-0.800917152537344301244104372017, 0.598775178820458831019379886129}, + {-0.801834719479981306022864373517, 0.597545883289693158246791426791}, + {-0.802750399628069044588585256861, 0.596315181675743932743216646486}, + {-0.803664190826924085264693076169, 0.595083076874570071623793410254}, + {-0.804576090926307108119885924680, 0.593849571785433516524221886357}, + {-0.805486097780429011194769373105, 0.592614669310891351017289707670}, + {-0.806394209247956239572374670388, 0.591378372356787584962489745521}, + {-0.807300423192014227069535081682, 0.590140683832249157703131459130}, + {-0.808204737480194612686545951874, 0.588901606649675946059119269194}, + {-0.809107149984558238209331193502, 0.587661143724736656501761444815}, + {-0.810007658581640921369171337574, 0.586419297976360720525690339855}, + {-0.810906261152459673091641434439, 0.585176072326730523087690016837}, + {-0.811802955582515473054172616685, 0.583931469701276184558480508713}, + {-0.812697739761799375912687537493, 0.582685493028668566317662680376}, + {-0.813590611584798395483630883973, 0.581438145240810277947218764893}, + {-0.814481568950498724390740790113, 0.580189429272831569406321250426}, + {-0.815370609762391174157869500050, 0.578939348063082004358648191555}, + {-0.816257731928477392457921268942, 0.577687904553122799633513295703}, + {-0.817142933361272749692716388381, 0.576435101687722051266860034957}, + {-0.818026211977813333398046324874, 0.575180942414845297605552332243}, + {-0.818907565699658945845840207767, 0.573925429685650745348368673149}, + {-0.819786992452898766181590417546, 0.572668566454481497984829729830}, + {-0.820664490168157456650988024194, 0.571410355678857340144816134853}, + {-0.821540056780597605090576962539, 0.570150800319470296706469980563}, + {-0.822413690229926275243599320675, 0.568889903340176084078905205388}, + {-0.823285388460400113785908615682, 0.567627667707986338641035217734}, + {-0.824155149420828680995043669100, 0.566364096393063731760264545301}, + {-0.825022971064580112887654195220, 0.565099192368714198231316458987}, + {-0.825888851349586783356926389388, 0.563832958611378165514338434150}, + {-0.826752788238348412797051878442, 0.562565398100626778976618425077}, + {-0.827614779697938285352165621589, 0.561296513819151687840758313541}, + {-0.828474823700007134696932098450, 0.560026308752760382247970483149}, + {-0.829332918220788029017853659752, 0.558754785890368643741510368272}, + {-0.830189061241102255195301040658, 0.557481948223991663482479452796}, + {-0.831043250746362316405679848685, 0.556207798748739934424634157040}, + {-0.831895484726577483236553689494, 0.554932340462810591574793761538}, + {-0.832745761176359455824069755181, 0.553655576367479418387063105911}, + {-0.833594078094925250432822849689, 0.552377509467095961781524238177}, + {-0.834440433486103083637885902135, 0.551098142769075649560761576140}, + {-0.835284825358337368328420780017, 0.549817479283890908625664906140}, + {-0.836127251724692266421357089712, 0.548535522025067279194843195000}, + {-0.836967710602856906909607914713, 0.547252274009174199953520201234}, + {-0.837806200015150936977192941413, 0.545967738255817569559269486490}, + {-0.838642717988527186534497559478, 0.544681917787634750638403602352}, + {-0.839477262554578440578723075305, 0.543394815630284910845659851475}, + {-0.840309831749540769862960587488, 0.542106434812443915838287011866}, + {-0.841140423614297971788289487449, 0.540816778365796779759477885818}, + {-0.841969036194387676630412897794, 0.539525849325029005498777223693}, + {-0.842795667540004234119521697721, 0.538233650727821588688470910711}, + {-0.843620315706003931488510261261, 0.536940185614843135120111128344}, + {-0.844442978751910655610402045568, 0.535645457029741089982621815579}, + {-0.845263654741918335489003766270, 0.534349468019137407992502630805}, + {-0.846082341744896937463238373311, 0.533052221632619671609631950560}, + {-0.846899037834397239166150939127, 0.531753720922733319476094493439}, + {-0.847713741088654160193982534111, 0.530453968944976650412570506887}, + {-0.848526449590592646288200739946, 0.529152968757790720388811678276}, + {-0.849337161427830777959968600044, 0.527850723422555234698450021824}, + {-0.850145874692685099560662820295, 0.526547236003579555152498414827}, + {-0.850952587482175726307787044789, 0.525242509568094706473573296535}, + {-0.851757297898029119842533418705, 0.523936547186248491314586317458}, + {-0.852560004046683972411813101644, 0.522629351931096830519152263150}, + {-0.853360704039295425715749843221, 0.521320926878595658493509290565}, + {-0.854159395991738845665963708598, 0.520011275107595927202908114850}, + {-0.854956078024614818389181891689, 0.518700399699835168476624858158}, + {-0.855750748263253924186244603334, 0.517388303739929056312973898457}, + {-0.856543404837719846156574021734, 0.516074990315366854964906906389}, + {-0.857334045882815587447112193331, 0.514760462516501204888186293829}, + {-0.858122669538086135787580133183, 0.513444723436543459804681788228}, + {-0.858909273947823792560996025713, 0.512127776171554915940475893876}, + {-0.859693857261072613695773725340, 0.510809623820439151486993978324}, + {-0.860476417631632184424006482004, 0.509490269484936253441276221565}, + {-0.861256953218062060173565441801, 0.508169716269614824000200314913}, + {-0.862035462183687206660920310242, 0.506847967281863320820889384777}, + {-0.862811942696600442381793527602, 0.505525025631885283061706104490}, + {-0.863586392929667989726283394702, 0.504200894432690560620358155575}, + {-0.864358811060533915870962573536, 0.502875576800086987461213539063}, + {-0.865129195271623574470254425250, 0.501549075852675607656294687331}, + {-0.865897543750148823704648748389, 0.500221394711840794400359300198}, + {-0.866663854688111134905170729326, 0.498892536501744587873474756634}, + {-0.867428126282306810601596680499, 0.497562504349319367769055588724}, + {-0.868190356734331203369947616011, 0.496231301384258360887002936579}, + {-0.868950544250582490590772977157, 0.494898930739011144730454816454}, + {-0.869708687042265560229736820474, 0.493565395548774932255042813267}, + {-0.870464783325397672975043406041, 0.492230698951486134173904929412}, + {-0.871218831320811015750393835333, 0.490894844087815029887167384004}, + {-0.871970829254157697718596864433, 0.489557834101157607342713617982}, + {-0.872720775355914302195969867171, 0.488219672137626792274289755369}, + {-0.873468667861384773232202860527, 0.486880361346047618731347483845}, + {-0.874214505010706188770086555451, 0.485539904877947070538368734560}, + {-0.874958285048851647225376382266, 0.484198305887549029780103637677}, + {-0.875700006225634486334286066267, 0.482855567531765894617734602434}, + {-0.876439666795713612224005828466, 0.481511692970189975060435472187}, + {-0.877177265018596052925659023458, 0.480166685365088330428307017428}, + {-0.877912799158641732333308027592, 0.478820547881394109612784859564}, + {-0.878646267485068133140657664626, 0.477473283686698113381652319731}, + {-0.879377668271953294443221693655, 0.476124895951243520819673449296}, + {-0.880106999798240252630421309732, 0.474775387847917285100152184896}, + {-0.880834260347741926366893494560, 0.473424762552241584767642734732}, + {-0.881559448209143670105447654350, 0.472073023242368938756641227883}, + {-0.882282561676008603157583820575, 0.470720173099071770295154237829}, + {-0.883003599046780829340264062921, 0.469366215305737521923390431766}, + {-0.883722558624789433778801139852, 0.468011153048360051265319725644}, + {-0.884439438718253700955074236845, 0.466654989515531026800232439200}, + {-0.885154237640285113108973291673, 0.465297727898434543281069863951}, + {-0.885866953708892679308917195158, 0.463939371390838739550588343263}, + {-0.886577585246987043277044904244, 0.462579923189086861246011039839}, + {-0.887286130582383258946777004894, 0.461219386492092320306568353772}, + {-0.887992588047805453399519137747, 0.459857764501329646655847227521}, + {-0.888696955980891600823667886289, 0.458495060420826272551408919753}, + {-0.889399232724195409893752639618, 0.457131277457157259025422035847}, + {-0.890099416625192207952466105780, 0.455766418819434804277079820167}, + {-0.890797506036281494523620949622, 0.454400487719303580735896730403}, + {-0.891493499314791271181945830904, 0.453033487370931853277511436318}, + {-0.892187394822982482445183904929, 0.451665420991002597439489818498}, + {-0.892879190928051791331654385431, 0.450296291798708614440016617664}, + {-0.893568886002135909230048582685, 0.448926103015743482860244739641}, + {-0.894256478422316036791528404137, 0.447554857866293065438156872915}, + {-0.894941966570620750509590379806, 0.446182559577029957953442362850}, + {-0.895625348834029999522954312852, 0.444809211377105051532510060497}, + {-0.896306623604479546507661780197, 0.443434816498138484330837627567}, + {-0.896985789278863854256940157939, 0.442059378174215034107419342035}, + {-0.897662844259040748617906047002, 0.440682899641873071505671077830}, + {-0.898337786951834305071429298550, 0.439305384140099952627878110434}, + {-0.899010615769038956557324127061, 0.437926834910323137250998115633}, + {-0.899681329127423934366447610955, 0.436547255196401307042464168262}, + {-0.900349925448735710631353867939, 0.435166648244619203023120235230}, + {-0.901016403159702217173787630600, 0.433785017303678743783024174263}, + {-0.901680760692037730485992597096, 0.432402365624690199208401963915}, + {-0.902342996482444315020643443859, 0.431018696461166972433431965328}, + {-0.903003108972617041239061563829, 0.429634013069016551522594227208}, + {-0.903661096609247982414103717019, 0.428248318706531960753380872120}, + {-0.904316957844028213031606355798, 0.426861616634386764612685283282}, + {-0.904970691133653248883206288156, 0.425473910115623965566555853002}, + {-0.905622294939825267512389928015, 0.424085202415651563168097482048}, + {-0.906271767729257438084289333347, 0.422695496802233228184064728339}, + {-0.906919107973678029210873319244, 0.421304796545479753877572193232}, + {-0.907564314149832629396996708238, 0.419913104917843560404122627006}, + {-0.908207384739488587932498830924, 0.418520425194109924049712390115}, + {-0.908848318229439011695092176524, 0.417126760651387928913180758173}, + {-0.909487113111505429685621493263, 0.415732114569105248857994183709}, + {-0.910123767882541567786347513902, 0.414336490228999265728049294921}, + {-0.910758281044437567608440531330, 0.412939890915108076541173431906}, + {-0.911390651104122206938029648882, 0.411542319913765497485513833453}, + {-0.912020876573568228806720981083, 0.410143780513590405778501235545}, + {-0.912648955969793895803832128877, 0.408744276005481410596331670604}, + {-0.913274887814867653013095605274, 0.407343809682608193334374391270}, + {-0.913898670635911569704035173345, 0.405942384840402625822974869152}, + {-0.914520302965104447956434796652, 0.404540004776552997167726744010}, + {-0.915139783339685153329412514722, 0.403136672790995465032182210052}, + {-0.915757110301956722686611556128, 0.401732392185905062831352552166}, + {-0.916372282399289139753761901375, 0.400327166265689982083131326362}, + {-0.916985298184122887832359083404, 0.398920998336983079202155977327}, + {-0.917596156213972835580250375642, 0.397513891708632383092947293335}, + {-0.918204855051430790524591429858, 0.396105849691696598746659674362}, + {-0.918811393264169939953944776789, 0.394696875599433727455078724233}, + {-0.919415769424946960342026613944, 0.393286972747296403873917824967}, + {-0.920017982111606458239805306221, 0.391876144452922570149411285456}, + {-0.920618029907083856855365411320, 0.390464394036126705156419802734}, + {-0.921215911399408726722981555213, 0.389051724818894328894458567447}, + {-0.921811625181708005349889845093, 0.387638140125372954170046568834}, + {-0.922405169852209882996874057426, 0.386223643281863038279055899693}, + {-0.922996544014246356191222275811, 0.384808237616812764958496018153}, + {-0.923585746276256558395800766448, 0.383391926460808829535409358868}, + {-0.924172775251791089878850016248, 0.381974713146567279586918175482}, + {-0.924757629559513794070824133087, 0.380556601008928852003521114966}, + {-0.925340307823206198456489346427, 0.379137593384847482180788347250}, + {-0.925920808671770068087880645180, 0.377717693613385641082658139567}, + {-0.926499130739230403186468265631, 0.376296905035705064879181236392}, + {-0.927075272664740102079861117090, 0.374875230995057651117718933165}, + {-0.927649233092581182447133869573, 0.373452674836780240674727338046}, + {-0.928221010672169333233227916935, 0.372029239908285236371199289351}, + {-0.928790604058056912251117864798, 0.370604929559051721188467354295}, + {-0.929358011909935610717070630926, 0.369179747140619907153080703210}, + {-0.929923232892639561875114395662, 0.367753696006582142530305645778}, + {-0.930486265676149670866834640037, 0.366326779512573641461870010971}, + {-0.931047108935595169043608620996, 0.364899001016267598984654796368}, + {-0.931605761351257832814098946983, 0.363470363877363922266994222809}, + {-0.932162221608574426134907753294, 0.362040871457584179093913689940}, + {-0.932716488398140142201953040058, 0.360610527120662549549479081179}, + {-0.933268560415711934119542547705, 0.359179334232336611165692374925}, + {-0.933818436362210957391027932317, 0.357747296160341843318519750028}, + {-0.934366114943725789565576178575, 0.356314416274402578910240890764}, + {-0.934911594871516093974150862778, 0.354880697946222845029495829294}, + {-0.935454874862014729153258940642, 0.353446144549480700813859357368}, + {-0.935995953636831301558629547799, 0.352010759459819300154492793808}, + {-0.936534829922755496234287875268, 0.350574546054837621333888364461}, + {-0.937071502451759075213999494736, 0.349137507714085248977653463953}, + {-0.937605969960999985346461471636, 0.347699647819051549380020560420}, + {-0.938138231192824356696746690432, 0.346260969753160008366421607207}, + {-0.938668284894770055259982655116, 0.344821476901759571553895966645}, + {-0.939196129819569791585820439650, 0.343381172652115151944229864966}, + {-0.939721764725153341224483938277, 0.341940060393402189831135729037}, + {-0.940245188374650764373541278474, 0.340498143516697382437996566296}, + {-0.940766399536396069613886083971, 0.339055425414969691111366500991}, + {-0.941285396983928768221971949970, 0.337611909483074512650091492105}, + {-0.941802179495997648928096168675, 0.336167599117744742009961100848}, + {-0.942316745856563775518566217215, 0.334722497717581279896847945565}, + {-0.942829094854802596259446545446, 0.333276608683048203296550582309}, + {-0.943339225285107718654842301476, 0.331829935416461274666488634466}, + {-0.943847135947092685803738731920, 0.330382481321982779398638285784}, + {-0.944352825645594640135982444917, 0.328934249805612477501881585340}, + {-0.944856293190677209992145435535, 0.327485244275178111195145902457}, + {-0.945357537397632285980364486022, 0.326035468140330186859188188464}, + {-0.945856557086983795734624891338, 0.324584924812532371607431969096}, + {-0.946353351084490590494624484563, 0.323133617705052389457165418207}, + {-0.946847918221148110440310574631, 0.321681550232956470214418231990}, + {-0.947340257333191937405558746832, 0.320228725813100079111706008916}, + {-0.947830367262101014524944275763, 0.318775147864118535423472167167}, + {-0.948318246854598978501371675520, 0.317320819806422071973628362684}, + {-0.948803894962658378453568275290, 0.315865745062184122282644693769}, + {-0.949287310443502119206016232056, 0.314409927055336657630846275424}, + {-0.949768492159606569913421481033, 0.312953369211560472606947769236}, + {-0.950247438978705227796694998688, 0.311496074958276025768100225832}, + {-0.950724149773789606321372502862, 0.310038047724637833013616727840}, + {-0.951198623423113232000503103336, 0.308579290941525308245019232345}, + {-0.951670858810193753818396089628, 0.307119808041533159936875563290}, + {-0.952140854823815829810484956397, 0.305659602458966062066281210718}, + {-0.952608610358033236487074191245, 0.304198677629829328239452479465}, + {-0.953074124312172199502413150185, 0.302737036991819252751412250291}, + {-0.953537395590833170011535457888, 0.301274683984318281115832860451}, + {-0.953998423103894488406240270706, 0.299811622048383519256731233327}, + {-0.954457205766513494538116901822, 0.298347854626741404437950677675}, + {-0.954913742499130413499131009303, 0.296883385163778545923207730084}, + {-0.955368032227470243000766458863, 0.295418217105532121546929147371}, + {-0.955820073882545417909284424240, 0.293952353899684604154884937088}, + {-0.956269866400658030691772637510, 0.292485798995554102663874118662}, + {-0.956717408723403051062916802039, 0.291018555844085147210620334590}, + {-0.957162699797670213364142455248, 0.289550627897842971503195030891}, + {-0.957605738575646237009664218931, 0.288082018611004353481064299558}, + {-0.958046524014818490222467062267, 0.286612731439347845352472177183}, + {-0.958485055077976100257330926979, 0.285142769840248999635434756783}, + {-0.958921330733213062025299677771, 0.283672137272668600793679161143}, + {-0.959355349953930791606637740188, 0.282200837197147558210730267092}, + {-0.959787111718839902607669500867, 0.280728873075797469294201391676}, + {-0.960216615011963425807550720492, 0.279256248372291293602387440842}, + {-0.960643858822638585515107934043, 0.277782966551857635195688089880}, + {-0.961068842145519242059492626140, 0.276309031081271305740898469594}, + {-0.961491563980579000414650181483, 0.274834445428843998637802314988}, + {-0.961912023333112209400042047491, 0.273359213064418682392897608224}, + {-0.962330219213737403372022072290, 0.271883337459359941679082339760}, + {-0.962746150638399411647583292506, 0.270406822086544873506852582068}, + {-0.963159816628371356905802258552, 0.268929670420357591620330595106}, + {-0.963571216210257208700795672485, 0.267451885936677846711262418467}, + {-0.963980348415994114930072100833, 0.265973472112875586326197208109}, + {-0.964387212282854178191371374851, 0.264494432427801906548836541333}, + {-0.964791806853447786451738465985, 0.263014770361779115503964021627}, + {-0.965194131175724723270548111032, 0.261534489396595459798078309177}, + {-0.965594184302976721312461449997, 0.260053593015495410067927650744}, + {-0.965991965293840570971894976537, 0.258572084703170446129405490865}, + {-0.966387473212298897529137775564, 0.257089967945753061773217496011}, + {-0.966780707127683269774820473685, 0.255607246230807605424928397042}, + {-0.967171666114676531478266952035, 0.254123923047320676715798981604}, + {-0.967560349253314355699728821492, 0.252640001885695852923419124636}, + {-0.967946755628987798303342060535, 0.251155486237742087141100455483}, + {-0.968330884332445185336268878018, 0.249670379596668573496387466548}, + {-0.968712734459794666541654351022, 0.248184685457075060455167658802}, + {-0.969092305112506102737768287625, 0.246698407314942580459415921723}, + {-0.969469595397413064219449552184, 0.245211548667627537989588404344}, + {-0.969844604426714829159550390614, 0.243724113013852411446791279559}, + {-0.970217331317979159166497993283, 0.242236103853696121968042120898}, + {-0.970587775194143631551924045198, 0.240747524688588371288844314222}, + {-0.970955935183517970799016438832, 0.239258379021300177091902128268}, + {-0.971321810419786157986266061926, 0.237768670355934269577957707043}, + {-0.971685400042008429188911122765, 0.236278402197919901173150947216}, + {-0.972046703194623384902683937980, 0.234787578054001133676109702719}, + {-0.972405719027449766400650332798, 0.233296201432231620209734046512}, + {-0.972762446695688454134653966321, 0.231804275841965057303184494231}, + {-0.973116885359925132270575431903, 0.230311804793845581462718996590}, + {-0.973469034186131065844449494762, 0.228818791799802190300994197969}, + {-0.973818892345666098364631579898, 0.227325240373039111352326813176}, + {-0.974166459015280317146334709832, 0.225831154028026254154681851105}, + {-0.974511733377115829668468904856, 0.224336536280493548112247026438}, + {-0.974854714618708428908178120764, 0.222841390647421339066269752038}, + {-0.975195401932990368898401811748, 0.221345720647030896888196593864}, + {-0.975533794518291252906294630520, 0.219849529798779030898003838956}, + {-0.975869891578341031035392916237, 0.218352821623346488033590162559}, + {-0.976203692322270555337127007078, 0.216855599642632623780258427360}, + {-0.976535195964614355368382803135, 0.215357867379745826497128291521}, + {-0.976864401725312636592946091696, 0.213859628358993886232397585445}, + {-0.977191308829712279582224709884, 0.212360886105878415852643570361}, + {-0.977515916508569171483600257488, 0.210861644147085108835781852576}, + {-0.977838223998050426466477347276, 0.209361906010474246864205838392}, + {-0.978158230539735051856098380085, 0.207861675225075009931785530171}, + {-0.978475935380616834713407570234, 0.206360955321075734136826440590}, + {-0.978791337773105674102680495707, 0.204859749829814474786360278813}, + {-0.979104436975029135403758573375, 0.203358062283773649570051134106}, + {-0.979415232249634781780400771822, 0.201855896216568214684983217921}, + {-0.979723722865591173381005773990, 0.200353255162940474543020741294}, + {-0.980029908096989976762358764972, 0.198850142658750395074918060345}, + {-0.980333787223347963291075757297, 0.197346562240966055812307899942}, + {-0.980635359529608119366628216085, 0.195842517447657848972397687248}, + {-0.980934624306141644822787384328, 0.194338011817988876028806544127}, + {-0.981231580848749618262161220628, 0.192833048892205344282402279532}, + {-0.981526228458664773413033799443, 0.191327632211630821457148954323}, + {-0.981818566442552498330087473732, 0.189821765318656660026519489293}, + {-0.982108594112513499929661975330, 0.188315451756732171739727732529}, + {-0.982396310786084692168174115068, 0.186808695070359159773332180521}, + {-0.982681715786240861376654720516, 0.185301498805082093257468045522}, + {-0.982964808441396442617588036228, 0.183793866507478476091108632318}, + {-0.983245588085407073997146198963, 0.182285801725153601138273984361}, + {-0.983524054057571261999726175418, 0.180777308006728726352818625855}, + {-0.983800205702631602733276849904, 0.179268388901835717952337745373}, + {-0.984074042370776447263835962076, 0.177759047961107419233428572625}, + {-0.984345563417641900016974432219, 0.176249288736167991631376139594}, + {-0.984614768204312595933913598856, 0.174739114779627141560425229727}, + {-0.984881656097323698872969544027, 0.173228529645070544740192985955}, + {-0.985146226468662122854880180967, 0.171717536887050020721900978060}, + {-0.985408478695768419441947116866, 0.170206140061077954017676461262}, + {-0.985668412161537554894152890483, 0.168694342723617496382360059215}, + {-0.985926026254321130615210222459, 0.167182148432072963384342756399}, + {-0.986181320367928160308679252921, 0.165669560744784422068320850485}, + {-0.986434293901627068379411866772, 0.164156583221015978102386156934}, + {-0.986684946260146689134273856325, 0.162643219420950307929629730097}, + {-0.986933276853677710072076934011, 0.161129472905679055338978855616}, + {-0.987179285097874337218115670112, 0.159615347237193144769307195929}, + {-0.987422970413855405347192117915, 0.158100845978376952638555508202}, + {-0.987664332228205710251245363906, 0.156585972692998648403417405461}, + {-0.987903369972977785096190928016, 0.155070730945700591130176348997}, + {-0.988140083085692566555735538714, 0.153555124301993362045948288142}, + {-0.988374471009341282190518995776, 0.152039156328246244376245499552}, + {-0.988606533192386449648836332926, 0.150522830591677425626784270207}, + {-0.988836269088763430978872293053, 0.149006150660348779535269159169}, + {-0.989063678157881542851725953369, 0.147489120103153736884848967748}, + {-0.989288759864625166784435350564, 0.145971742489812206233779079412}, + {-0.989511513679355192429909493512, 0.144454021390860720686077911523}, + {-0.989731939077910571889162838488, 0.142935960377642778951212676475}, + {-0.989950035541608985845130064263, 0.141417563022302961162068868362}, + {-0.990165802557248397874900547322, 0.139898832897777436468089717891}, + {-0.990379239617108164672742987023, 0.138379773577783943272478950348}, + {-0.990590346218950146273130030750, 0.136860388636816293628228891066}, + {-0.990799121866020260362972749135, 0.135340681650134408986474454650}, + {-0.991005566067049370460040336184, 0.133820656193754772278481368630}, + {-0.991209678336253952046774884366, 0.132300315844444987822825510193}, + {-0.991411458193338535060945559962, 0.130779664179711874183453801379}, + {-0.991610905163495370828741215519, 0.129258704777796107343590392702}, + {-0.991808018777406430466214715125, 0.127737441217662561765422424287}, + {-0.992002798571244515102307559573, 0.126215877078990457160756477606}, + {-0.992195244086673922012664661452, 0.124694015942167599209078332478}, + {-0.992385354870851665864961432817, 0.123171861388280706739450920395}, + {-0.992573130476428810986533335381, 0.121649416999105600134534199697}, + {-0.992758570461551137498190655606, 0.120126686357101414293069296946}, + {-0.992941674389860473581848054891, 0.118603673045400898056200844621}, + {-0.993122441830495583658944269700, 0.117080380647800602611496856298}, + {-0.993300872358093278613466736715, 0.115556812748755580178006141523}, + {-0.993476965552789192948068830447, 0.114032972933367351964228930683}, + {-0.993650721000219117051699413423, 0.112508864787378676242113328954}, + {-0.993822138291519663333417611284, 0.110984491897163653484348344591}, + {-0.993991217023329376445417437935, 0.109459857849718095179625265700}, + {-0.994157956797789732483749958192, 0.107934966232653598017243723461}, + {-0.994322357222545805122138062870, 0.106409820634187898824585261082}, + {-0.994484417910747597879606018978, 0.104884424643135021337769785532}, + {-0.994644138481050710254294244805, 0.103358781848899530797503132362}, + {-0.994801518557617114879576547537, 0.101832895841466722353096940878}, + {-0.994956557770116378769387210923, 0.100306770211392892733215376211}, + {-0.995109255753726107407430845342, 0.098780408549799941786417889489}, + {-0.995259612149133277014811937988, 0.097253814448363423705856689594}, + {-0.995407626602534900683849627967, 0.095726991499307162447607311151}, + {-0.995553298765638472467287556356, 0.094199943295393481768051913150}, + {-0.995696628295663521690528341423, 0.092672673429913421383474769755}, + {-0.995837614855341612951633578632, 0.091145185496680963810334219488}, + {-0.995976258112917789411255853338, 0.089617483090023195013706924783}, + {-0.996112557742151127904151053372, 0.088089569804770576078034594047}, + {-0.996246513422315516095295606647, 0.086561449236251072902881276150}, + {-0.996378124838200207591398793738, 0.085033124980280469507043505928}, + {-0.996507391680110821141624910524, 0.083504600633152459288055524667}, + {-0.996634313643869895749105580762, 0.081975879791633385340610118419}, + {-0.996758890430818000893964381248, 0.080446966052950152903378011615}, + {-0.996881121747813847555619304330, 0.078917863014784941921853089752}, + {-0.997001007307235287413504920551, 0.077388574275265326063433235504}, + {-0.997118546826979978980887153739, 0.075859103432954558265954858598}, + {-0.997233740030466275783282981138, 0.074329454086845714311237998118}, + {-0.997346586646633115336157970887, 0.072799629836351908984681813308}, + {-0.997457086409941906524068144790, 0.071269634281296484479284458757}, + {-0.997565239060375752444542740704, 0.069739471021907209480339417951}, + {-0.997671044343441004720318687760, 0.068209143658806509202818801896}, + {-0.997774502010167818610852918937, 0.066678655793001598284241993042}, + {-0.997875611817110153012322371069, 0.065148011025879137836369636716}, + {-0.997974373526346991702951072511, 0.063617212959193245036537689430}, + {-0.998070786905482343343010143144, 0.062086265195060087729306275151}, + {-0.998164851727646240675539957010, 0.060555171335948065891585656573}, + {-0.998256567771495184615559992380, 0.059023934984668048608913437647}, + {-0.998345934821212366294673756784, 0.057492559744367524587893569787}, + {-0.998432952666508444217186024616, 0.055961049218520804438004034864}, + {-0.998517621102622099371615149721, 0.054429407010919209075616720384}, + {-0.998599939930320368297600452934, 0.052897636725665241053118137415}, + {-0.998679908955899087175112072146, 0.051365741967162793779611007494}, + {-0.998757527991183335913660812366, 0.049833726340107319108252426076}, + {-0.998832796853527993263810458302, 0.048301593449480456632372238346}, + {-0.998905715365818291928690086934, 0.046769346900538022460125375801}, + {-0.998976283356469818563994067517, 0.045236990298804582999459000803}, + {-0.999044500659429290934099299193, 0.043704527250063698873283613011}, + {-0.999110367114174890978972598532, 0.042171961360348064751235597214}, + {-0.999173882565716375836473162053, 0.040639296235933694556585749069}, + {-0.999235046864595854998469803832, 0.039106535483330123748046958099}, + {-0.999293859866887679288538492983, 0.037573682709270576907112371146}, + {-0.999350321434199440062684516306, 0.036040741520706139067176110302}, + {-0.999404431433671303075527703186, 0.034507715524795951056447051997}, + {-0.999456189737977340747931975784, 0.032974608328897377085286990450}, + {-0.999505596225325310122400424007, 0.031441423540560627103435109575}, + {-0.999552650779456985929982693051, 0.029908164767516717819084703933}, + {-0.999597353289648382634879908437, 0.028374835617672095056107650635}, + {-0.999639703650710198523654526070, 0.026841439699098811749733428655}, + {-0.999679701762987926727532794757, 0.025307980620024688594993378388}, + {-0.999717347532362188289312143752, 0.023774461988827513131417035197}, + {-0.999752640870248843185663645272, 0.022240887414025200391476388972}, + {-0.999785581693599212371736939531, 0.020707260504265974365711855398}, + {-0.999816169924900410848067622283, 0.019173584868322539331852993882}, + {-0.999844405492175236638274782308, 0.017639864115082257850497526874}, + {-0.999870288328982947945178239024, 0.016106101853537325291343407230}, + {-0.999893818374418485994681304874, 0.014572301692779386986242862179}, + {-0.999914995573113474236492947966, 0.013038467241987494044108686353}, + {-0.999933819875235996299522867048, 0.011504602110422715299797857824}, + {-0.999950291236490484969579028984, 0.009970709907418311840343605468}, + {-0.999964409618118277300879981340, 0.008436794242369921939528332189}, + {-0.999976174986897614616054852377, 0.006902858724729715907131311070}, + {-0.999985587315143198416933500994, 0.005368906963996586227672036529}, + {-0.999992646580707189585268679366, 0.003834942569706309509897090848}, + {-0.999997352766978209182013870304, 0.002300969151425725622156504002}, + {-0.999999705862882226625742987380, 0.000766990318742907664986696581}}; +__device__ double2 negTwids13[4096] = { + {0.999999926465717892121176646469, 0.000383495187571395563207177215}, + {0.999999338191525533048320539820, 0.001150485337113848474319133253}, + {0.999998161643486982441686450329, 0.001917474809855419012188937344}, + {0.999996396822294353334825700585, 0.002684463154595961680015658857}, + {0.999994043728985815278065274470, 0.003451449920135993970626842042}, + {0.999991102364945594338507817156, 0.004218434655276962971792720225}, + {0.999987572731904084122334097628, 0.004985416908821510562077605755}, + {0.999983454831937734752500546165, 0.005752396229573735787765631500}, + {0.999978748667468830824134329305, 0.006519372166339468081808217192}, + {0.999973454241265935493743199913, 0.007286344267926521400813300033}, + {0.999967571556443779456913034664, 0.008053312083144971780801490979}, + {0.999961100616462816859097983979, 0.008820275160807411474195305345}, + {0.999954041425129780407132784603, 0.009587233049729224770851843118}, + {0.999946393986597459324627834576, 0.010354185298728842135052019557}, + {0.999938158305364588329666730715, 0.011121131456628021230703673439}, + {0.999929334386276069679411193647, 0.011888071072252091517351679784}, + {0.999919922234522751125496142777, 0.012655003694430242214274962009}, + {0.999909921855641536936332158803, 0.013421928871995765161773128682}, + {0.999899333255515387897105483717, 0.014188846153786344519986961643}, + {0.999888156440373321309778020805, 0.014955755088644296160738100809}, + {0.999876391416790410993087334646, 0.015722655225416857366349532299}, + {0.999864038191687676260244188597, 0.016489546112956436629826129092}, + {0.999851096772332192941235007311, 0.017256427300120877332822999506}, + {0.999837567166337093382821876730, 0.018023298335773745709742499344}, + {0.999823449381661566448542544094, 0.018790158768784554627062632903}, + {0.999808743426610524451803030388, 0.019557008148029082772456632711}, + {0.999793449309835269289692405437, 0.020323846022389593229950932596}, + {0.999777567040332937331470475328, 0.021090671940755121444022179844}, + {0.999761096627446610440870244929, 0.021857485452021735428118631717}, + {0.999744038080865426998400380398, 0.022624286105092802912075455879}, + {0.999726391410624470879042746674, 0.023391073448879258489530030829}, + {0.999708156627104882474554869987, 0.024157847032299863826443342418}, + {0.999689333741033636648865012830, 0.024924606404281467869621380373}, + {0.999669922763483764782677098992, 0.025691351113759294810812150445}, + {0.999649923705874243751168251038, 0.026458080709677186947992311161}, + {0.999629336579970106946291252825, 0.027224794740987875302229426211}, + {0.999608161397882111209867161961, 0.027991492756653243295650312916}, + {0.999586398172067069900492697343, 0.028758174305644614715538054384}, + {0.999564046915327741871237776650, 0.029524838936942975758936924535}, + {0.999541107640812942491947978851, 0.030291486199539283813431111980}, + {0.999517580362016988537732231634, 0.031058115642434699910090500907}, + {0.999493465092780586367382511526, 0.031824726814640887095908539095}, + {0.999468761847290054767256606283, 0.032591319265180225539513259037}, + {0.999443470640077769040487964958, 0.033357892543086138659180761579}, + {0.999417591486021716917775847833, 0.034124446197403325575780996815}, + {0.999391124400346053668897639000, 0.034890979777188003974064400836}, + {0.999364069398620546991196533781, 0.035657492831508222352887571560}, + {0.999336426496761243143396313826, 0.036423984909444109825393809388}, + {0.999308195711029467744879184465, 0.037190455560088118980299753957}, + {0.999279377058032713954105474841, 0.037956904332545310376545444342}, + {0.999249970554724420424008712871, 0.038723330775933623160156571430}, + {0.999219976218403527212785775191, 0.039489734439384117925531114679}, + {0.999189394066714919873106737214, 0.040256114872041282026771114033}, + {0.999158224117649429452114873129, 0.041022471623063237744499787141}, + {0.999126466389543388402216805844, 0.041788804241622061474981109086}, + {0.999094120901079074670292357041, 0.042555112276904019652512545235}, + {0.999061187671284600675392084668, 0.043321395278109825488499495805}, + {0.999027666719533691264132357901, 0.044087652794454944282787067777}, + {0.998993558065545683710695357149, 0.044853884375169815468264999936}, + {0.998958861729386082828341386630, 0.045620089569500144044411626965}, + {0.998923577731465783813291636761, 0.046386267926707157316368324018}, + {0.998887706092541294289333109191, 0.047152418996067868572907855196}, + {0.998851246833715178397028466861, 0.047918542326875326886614914201}, + {0.998814199976435390659901258914, 0.048684637468438943241899607983}, + {0.998776565542495609051343308238, 0.049450703970084664007345054415}, + {0.998738343554035234994614711468, 0.050216741381155310941508673750}, + {0.998699534033539282340541376470, 0.050982749251010803237527113652}, + {0.998660137003838488389817484858, 0.051748727129028455895554117205}, + {0.998620152488108869803795641928, 0.052514674564603222584047159671}, + {0.998579580509872499760604114272, 0.053280591107147945439947989144}, + {0.998538421092996730799029592163, 0.054046476306093660380014398470}, + {0.998496674261694638907727039623, 0.054812329710889853839894669818}, + {0.998454340040524801480614769389, 0.055578150871004677879838595800}, + {0.998411418454391297316874442913, 0.056343939335925290190498770926}, + {0.998367909528543817643253532879, 0.057109694655158062259747708822}, + {0.998323813288577555091762860684, 0.057875416378228856928433998519}, + {0.998279129760433203699676596443, 0.058641104054683340640607980276}, + {0.998233858970396847887229796470, 0.059406757234087149976975439358}, + {0.998188000945100295524525790825, 0.060172375466026259416274513114}, + {0.998141555711520522820023870736, 0.060937958300107203379880616012}, + {0.998094523296980007387446676148, 0.061703505285957298276411364668}, + {0.998046903729146839268082658236, 0.062469015973224996385315677117}, + {0.997998697036034387863878691860, 0.063234489911580066268115274397}, + {0.997949903246001190915137613047, 0.063999926650713939713099875917}, + {0.997900522387751620634332994086, 0.064765325740339885207674797130}, + {0.997850554490335106549991905922, 0.065530686730193327127480529271}, + {0.997799999583146468573602305696, 0.066296009170032130231042799551}, + {0.997748857695925694955008111720, 0.067061292609636821704377496189}, + {0.997697128858758497393921516050, 0.067826536598810868716746824703}, + {0.997644813102075422861503284366, 0.068591740687380942098627656378}, + {0.997591910456652630756479993579, 0.069356904425197207775255492379}, + {0.997538420953611337793631719251, 0.070122027362133521055653773146}, + {0.997484344624417929026094498113, 0.070887109048087801332904689389}, + {0.997429681500884179889965253096, 0.071652149032982212495390683671}, + {0.997374431615167145181999330816, 0.072417146866763412726974991074}, + {0.997318594999768603948098188994, 0.073182102099402887573909026742}, + {0.997262171687536169706334021612, 0.073947014280897199745012926542}, + {0.997205161711661847157017746213, 0.074711882961268211156280472096}, + {0.997147565105683475472631016601, 0.075476707690563388242210862700}, + {0.997089381903483396030196672655, 0.076241488018856065633777063795}, + {0.997030612139289451612000902969, 0.077006223496245640447455116373}, + {0.996971255847674320271778469760, 0.077770913672857946985494947967}, + {0.996911313063555737379317633895, 0.078535558098845478780525297680}, + {0.996850783822196606642762617412, 0.079300156324387596762370833403}, + {0.996789668159204556019403753453, 0.080064707899690890080535154993}, + {0.996727966110532492827189798845, 0.080829212374989328759866680230}, + {0.996665677712478159655518084037, 0.081593669300544652278617263619}, + {0.996602803001684134365234513098, 0.082358078226646536101895890170}, + {0.996539342015137941110936026234, 0.083122438703612910870788255124}, + {0.996475294790172161363273062307, 0.083886750281790226080325112434}, + {0.996410661364464100842042171280, 0.084651012511553616612935968533}, + {0.996345441776035900538488476741, 0.085415224943307332949871124583}, + {0.996279636063254647737608138414, 0.086179387127484893826867562439}, + {0.996213244264832042951240964612, 0.086943498614549377667692908744}, + {0.996146266419824621962675337272, 0.087707558954993658506538167785}, + {0.996078702567633977871253136982, 0.088471567699340766810500724660}, + {0.996010552748005872913950042857, 0.089235524398144014379674615611}, + {0.995941817001031348688400157698, 0.089999428601987341291845723390}, + {0.995872495367145726952173845348, 0.090763279861485621213823549169}, + {0.995802587887129164734290043270, 0.091527077727284827934894906321}, + {0.995732094602106432290611337521, 0.092290821750062354555943500145}, + {0.995661015553546913103843962745, 0.093054511480527249411842660720}, + {0.995589350783264603883537802176, 0.093818146469420549138362730446}, + {0.995517100333418114566086387640, 0.094581726267515445205624757818}, + {0.995444264246510335247819512006, 0.095345250425617616985007884978}, + {0.995370842565388991296515541762, 0.096108718494565509304905503996}, + {0.995296835333246088239889104443, 0.096872130025230471228603335021}, + {0.995222242593618355854800938687, 0.097635484568517200143489276343}, + {0.995147064390386471011140656628, 0.098398781675363880538931482533}, + {0.995071300767776167894851369056, 0.099162020896742503195397944182}, + {0.994994951770357016762602597737, 0.099925201783659073351273605113}, + {0.994918017443043201097907513031, 0.100688323887153957647555557742}, + {0.994840497831093184544215546339, 0.101451386758302078416882352485}, + {0.994762392980109932949517315137, 0.102214389948213205117077961859}, + {0.994683702936040248232529847883, 0.102977333008032218009120128954}, + {0.994604427745175656561116284138, 0.103740215488939371835108715914}, + {0.994524567454151742218471099477, 0.104503036942150573374021860218}, + {0.994444122109948036580817642971, 0.105265796918917603486320899719}, + {0.994363091759888573228920449765, 0.106028494970528408547494336744}, + {0.994281476451641554881177853531, 0.106791130648307391881601802197}, + {0.994199276233218909304412136407, 0.107553703503615621928091172776}, + {0.994116491152977066469986766606, 0.108316213087851165308705958523}, + {0.994033121259616403442294085835, 0.109078658952449239483151188779}, + {0.993949166602181133356452846783, 0.109841040648882601327152030990}, + {0.993864627230059749507518063183, 0.110603357728661727543695292297}, + {0.993779503192984581261271159747, 0.111365609743335161607724614896}, + {0.993693794541031794054219972168, 0.112127796244489638666230746367}, + {0.993607501324621611438203672151, 0.112889916783750515749673581922}, + {0.993520623594518093035787842382, 0.113651970912781868916496819111}, + {0.993433161401829356584869401559, 0.114413958183286923464550000062}, + {0.993345114798006911804861829296, 0.115175878147008192708966589635}, + {0.993256483834846437552812403737, 0.115937730355727783293495747330}, + {0.993167268564487226711889888975, 0.116699514361267686624046291399}, + {0.993077469039412297213686997566, 0.117461229715489987035503816060}, + {0.992987085312448392038220390532, 0.118222875970297167103062463411}, + {0.992896117436765979213930677361, 0.118984452677632343564617656284}, + {0.992804565465879140795379953488, 0.119745959389479600387673485784}, + {0.992712429453645461840949337784, 0.120507395657864127547220789438}, + {0.992619709454266141435141435068, 0.121268761034852595726007962185}, + {0.992526405522286103710882798623, 0.122030055072553364481358073590}, + {0.992432517712593664782616542652, 0.122791277323116773678712831952}, + {0.992338046080420421723999879760, 0.123552427338735365536237509332}, + {0.992242990681341696657113971014, 0.124313504671644231569516136915}, + {0.992147351571276092663254075887, 0.125074508874121165247217390970}, + {0.992051128806485715827534477285, 0.125835439498486995058001980397}, + {0.991954322443575953194283556513, 0.126596296097105848188490995199}, + {0.991856932539495472767043793283, 0.127357078222385400323446447146}, + {0.991758959151536112486269303190, 0.128117785426777125445951810434}, + {0.991660402337333213296233225265, 0.128878417262776545637592562343}, + {0.991561262154865286078120334423, 0.129638973282923564145363570788}, + {0.991461538662453789605422116438, 0.130399453039802687426274019344}, + {0.991361231918763463610844155482, 0.131159856086043274947527947916}, + {0.991260341982802439808608596650, 0.131920181974319788986704793388}, + {0.991158868913921353716034445824, 0.132680430257352072187515545920}, + {0.991056812771814343854259732325, 0.133440600487905680626710136494}, + {0.990954173616518496636729196325, 0.134200692218792022591955515054}, + {0.990850951508413624324589363823, 0.134960705002868747159894269316}, + {0.990747146508222709115898396703, 0.135720638393039910729598318540}, + {0.990642758677011570078718705190, 0.136480491942256282333900685444}, + {0.990537788076188752128814485332, 0.137240265203515593439576036872}, + {0.990432234767505970118861569063, 0.137999957729862787747521224446}, + {0.990326098813057331682330186595, 0.138759569074390354259662672121}, + {0.990219380275280003367299741512, 0.139519098790238493812410069950}, + {0.990112079216953766547248960705, 0.140278546430595424387988146009}, + {0.990004195701200906398753431858, 0.141037911548697714181344053941}, + {0.989895729791486655990695453511, 0.141797193697830392622449835471}, + {0.989786681551618641172751722479, 0.142556392431327338954361039214}, + {0.989677051045747213642300721403, 0.143315507302571504277821645701}, + {0.989566838338365117877515331202, 0.144074537864995161351444608044}, + {0.989456043494307713181967756100, 0.144833483672080209903043623854}, + {0.989344666578752640617722136085, 0.145592344277358343163086829009}, + {0.989232707657220045049939471937, 0.146351119234411464198331032094}, + {0.989120166795572686169180087745, 0.147109808096871824689699792543}, + {0.989007044060015272357588855812, 0.147868410418422219221312730042}, + {0.988893339517095126822709971748, 0.148626925752796540391997837105}, + {0.988779053233701521463672179380, 0.149385353653779723304140247819}, + {0.988664185277066231982701083325, 0.150143693675208189652892087906}, + {0.988548735714763204818211761449, 0.150901945370970042015201784125}, + {0.988432704614708335100203839829, 0.151660108295005313649994604930}, + {0.988316092045159688694866417791, 0.152418182001306329320655663651}, + {0.988198898074717613226880530419, 0.153176166043917844072907996633}, + {0.988081122772324071945604373468, 0.153934059976937348546144335160}, + {0.987962766207263420881190540968, 0.154691863354515429795910108624}, + {0.987843828449161742710771250131, 0.155449575730855854560630291417}, + {0.987724309567986957780760803871, 0.156207196660215902328516790476}, + {0.987604209634049157173762978346, 0.156964725696906781671202679718}, + {0.987483528717999714530151322833, 0.157722162395293630243742200037}, + {0.987362266890832396271093784890, 0.158479506309795958873820609369}, + {0.987240424223882251375528085191, 0.159236756994887845850783492097}, + {0.987118000788826277513976492628, 0.159993914005098269992544146589}, + {0.986994996657682976959335974243, 0.160750976895011221667886047726}, + {0.986871411902812467609180657746, 0.161507945219266119130097081324}, + {0.986747246596916594008064294030, 0.162264818532558002805998853546}, + {0.986622500813038483258310407109, 0.163021596389637840607278462812}, + {0.986497174624562878086919681664, 0.163778278345312666708366577950}, + {0.986371268105216025823267500527, 0.164534863954445997880071672625}, + {0.986244781329065456354499019653, 0.165291352771958000023033719117}, + {0.986117714370520093147831630631, 0.166047744352825793479055960233}, + {0.985990067304330142228252498171, 0.166804038252083730586861065603}, + {0.985861840205586981156216097588, 0.167560234024823562215544825449}, + {0.985733033149723492094551602349, 0.168316331226194826342634769389}, + {0.985603646212513395674648108979, 0.169072329411405014587543860216}, + {0.985473679470071806107966949639, 0.169828228135719849767326650181}, + {0.985343132998854787096831842064, 0.170584026954463591208011052913}, + {0.985212006875659351834428889561, 0.171339725423019312300354499712}, + {0.985080301177623796071713968558, 0.172095323096829011522146402058}, + {0.984948015982227031983597953513, 0.172850819531394084282993617308}, + {0.984815151367289143280459029484, 0.173606214282275406191047295579}, + {0.984681707410970941118932842073, 0.174361506905093749386637114185}, + {0.984547684191773964101912497426, 0.175116696955529921320149355779}, + {0.984413081788540700323153487261, 0.175871783989325042307783064643}, + {0.984277900280454365322668763838, 0.176626767562280878598457434236}, + {0.984142139747038569019821352413, 0.177381647230260036662841116595}, + {0.984005800268157870824836663814, 0.178136422549186296260259609880}, + {0.983868881924017224527290181868, 0.178891093075044721460997720897}, + {0.983731384795162089318409925909, 0.179645658363882160246660646408}, + {0.983593308962478651835681375815, 0.180400117971807244510173973140}, + {0.983454654507193271051335159427, 0.181154471454990806389417912214}, + {0.983315421510872811339254440099, 0.181908718369666155822983455437}, + {0.983175610055424420430369991664, 0.182662858272129274839201684699}, + {0.983035220223095640434962660947, 0.183416890718739095111899928270}, + {0.982894252096474074775755980227, 0.184170815265917720005006685824}, + {0.982752705758487832277126017289, 0.184924631470150785395034631620}, + {0.982610581292404750008984137821, 0.185678338887987626204534308272}, + {0.982467878781833170442894243024, 0.186431937076041609469001514299}, + {0.982324598310721275318257994513, 0.187185425590990328625906613524}, + {0.982180739963357085642314814322, 0.187938803989575908826026306997}, + {0.982036303824369016801654197479, 0.188692071828605228978048558020}, + {0.981891289978725101406098474399, 0.189445228664950227059904364069}, + {0.981745698511732989288702810882, 0.190198274055548149918948297454}, + {0.981599529509040724661872445722, 0.190951207557401803072139045980}, + {0.981452783056635524872035603039, 0.191704028727579800506219953604}, + {0.981305459240844668578063192399, 0.192456737123216842233475176727}, + {0.981157558148334829617454033723, 0.193209332301513964091910224852}, + {0.981009079866112632117847169866, 0.193961813819738843056583732505}, + {0.980860024481523873340904629003, 0.194714181235225963773061153006}, + {0.980710392082253967771521274699, 0.195466434105376979379897761646}, + {0.980560182756327836095522343385, 0.196218571987660878042092349460}, + {0.980409396592109905199663444364, 0.196970594439614343773570226404}, + {0.980258033678303553060118247231, 0.197722501018841922970636915124}, + {0.980106094103951774876293256966, 0.198474291283016385234461154141}, + {0.979953577958436738981617963873, 0.199225964789878834393377360357}, + {0.979800485331479786843544843578, 0.199977521097239152592095479122}, + {0.979646816313141211018944431999, 0.200728959762976139069579062379}, + {0.979492570993820810265617637924, 0.201480280345037732203650193696}, + {0.979337749464256779319271117856, 0.202231482401441453600199338325}, + {0.979182351815526930138844363682, 0.202982565490274435848760958834}, + {0.979026378139047581683485077519, 0.203733529169693922122874596425}, + {0.978869828526574115024061484291, 0.204484372997927238424509255310}, + {0.978712703070200418231650019152, 0.205235096533272348695575715283}, + {0.978555001862359552511350102577, 0.205985699334097910329077762981}, + {0.978396724995823086068469365273, 0.206736180958843690502746426318}, + {0.978237872563701094108523648174, 0.207486540966020649445766821373}, + {0.978078444659442380881841927476, 0.208236778914211329016836771189}, + {0.977918441376834368661263852118, 0.208986894362070074748771730810}, + {0.977757862810002764675232356240, 0.209736886868323285648685327942}, + {0.977596709053411894174701046722, 0.210486755991769719509321134865}, + {0.977434980201864256343924353132, 0.211236501291280714953657593469}, + {0.977272676350500857367364915262, 0.211986122325800330212786093398}, + {0.977109797594800877362786195590, 0.212735618654345925992998900256}, + {0.976946344030581670381252479274, 0.213484989836008054453486693092}, + {0.976782315753998653384826411639, 0.214234235429950986562275261349}, + {0.976617712861545639313476385723, 0.214983354995412823118527967381}, + {0.976452535450054059928959304671, 0.215732348091705883330604365256}, + {0.976286783616693631948635356821, 0.216481214278216732571635816385}, + {0.976120457458971912956258165650, 0.217229953114406793002189033359}, + {0.975953557074734301401974789769, 0.217978564159812204792388001806}, + {0.975786082562163925580023260409, 0.218727046974044436744577524223}, + {0.975618034019781754651035043935, 0.219475401116790314048898835608}, + {0.975449411546446376597430116817, 0.220223626147812379105772606636}, + {0.975280215241354220268021890661, 0.220971721626949113570503868687}, + {0.975110445204038889244202437112, 0.221719687114115215909038170139}, + {0.974940101534371827973757262953, 0.222467522169301878953717732657}, + {0.974769184332561766659352997522, 0.223215226352576984192310760591}, + {0.974597693699155054325444780261, 0.223962799224085462590494444157}, + {0.974425629735034992684461485624, 0.224710240344049433369733037580}, + {0.974252992541422502270620498166, 0.225457549272768537074185246638}, + {0.974079782219875678350717862486, 0.226204725570620185370884769327}, + {0.973905998872289568879523358191, 0.226951768798059810849920836517}, + {0.973731642600896396544385424932, 0.227698678515621172335769983874}, + {0.973556713508265558765231162397, 0.228445454283916465909598514372}, + {0.973381211697303294627658942773, 0.229192095663636796754047963987}, + {0.973205137271252795905240873253, 0.229938602215552206908810717323}, + {0.973028490333694207059522796044, 0.230684973500512202626566704566}, + {0.972851270988544181150814438297, 0.231431209079445754372983401481}, + {0.972673479340056434949701724690, 0.232177308513361713160350063845}, + {0.972495115492821193825534464850, 0.232923271363348977081031421221}, + {0.972316179551765302768728815863, 0.233669097190576824374375064508}, + {0.972136671622152226390767282282, 0.234414785556295163226891986596}, + {0.971956591809581715857291328575, 0.235160336021834726061285891774}, + {0.971775940219990141955008766672, 0.235905748148607374847784967642}, + {0.971594716959650162024786368420, 0.236651021498106378659898041406}, + {0.971412922135170942006254790613, 0.237396155631906607963443889275}, + {0.971230555853497379281691337383, 0.238141150111664839927883008386}, + {0.971047618221911101876742122840, 0.238886004499120035982073773084}, + {0.970864109348029469259699908434, 0.239630718356093563858877359962}, + {0.970680029339806127453016415529, 0.240375291244489447395338288516}, + {0.970495378305530564944092475343, 0.241119722726294588577289346176}, + {0.970310156353828112685278028948, 0.241864012363579183872985822745}, + {0.970124363593660277160779514816, 0.242608159718496807499832357280}, + {0.969938000134323963230542631209, 0.243352164353284744491290325641}, + {0.969751066085452140264067111275, 0.244096025830264212741482765523}, + {0.969563561557013176006591947953, 0.244839743711840668316526148374}, + {0.969375486659311280668305244035, 0.245583317560504055254710920053}, + {0.969186841502985951812831899588, 0.246326746938829027611106425866}, + {0.968997626199012418446443462017, 0.247070031409475254768892682478}, + {0.968807840858700974884243350971, 0.247813170535187671239540918577}, + {0.968617485593697535861679170921, 0.248556163878796559929540421763}, + {0.968426560515983192445332861098, 0.249299011003218190518637698005}, + {0.968235065737874323055223158008, 0.250041711471454652926382777878}, + {0.968043001372022260397898207884, 0.250784264846594495690368376017}, + {0.967850367531413624533342954237, 0.251526670691812614943927428612}, + {0.967657164329369878785769287788, 0.252268928570370809527645405979}, + {0.967463391879547551788220971503, 0.253011038045617864256087159447}, + {0.967269050295937793393363790528, 0.253752998680989994007006771426}, + {0.967074139692867040807300327288, 0.254494810040010732699045092886}, + {0.966878660184995908366545336321, 0.255236471686291710447846980969}, + {0.966682611887320075716445444414, 0.255977983183532431521456373957}, + {0.966485994915169843721969300532, 0.256719344095520662918374910078}, + {0.966288809384209690378497725760, 0.257460553986133100501376702596}, + {0.966091055410438825923336025880, 0.258201612419334869397147258496}, + {0.965892733110190859768806603824, 0.258942518959180523197005641123}, + {0.965693842600133689479946497158, 0.259683273169813766401148313889}, + {0.965494383997269500774507378082, 0.260423874615468009530161452858}, + {0.965294357418934656500653090916, 0.261164322860466480147323409255}, + {0.965093762982799585614657189581, 0.261904617469222611436663328277}, + {0.964892600806868894203205400117, 0.262644758006240042202961149087}, + {0.964690871009481032416488233139, 0.263384744036113283005562379913}, + {0.964488573709308405490503446345, 0.264124575123527549624924404270}, + {0.964285709025357484769358507037, 0.264864250833259262662977562286}, + {0.964082277076968141571455817029, 0.265603770730176325098881306985}, + {0.963878277983814202301005025220, 0.266343134379238177800175435550}, + {0.963673711865903226403418102564, 0.267082341345496243611989939382}, + {0.963468578843575951253797029494, 0.267821391194094149401649929132}, + {0.963262879037507069313051033532, 0.268560283490267892592129328477}, + {0.963056612568704339949476889160, 0.269299017799346118717807030407}, + {0.962849779558509033527968767885, 0.270037593686750565513676747287}, + {0.962642380128595709365413313208, 0.270776010717996007404195779600}, + {0.962434414400972104708387178107, 0.271514268458690699592494866010}, + {0.962225882497979023710854562523, 0.272252366474536711127285570910}, + {0.962016784542290559478772138391, 0.272990304331329924902860284419}, + {0.961807120656913538958576737059, 0.273728081594960537259453303705}, + {0.961596890965187856004092736839, 0.274465697831413224516694526756}, + {0.961386095590786249331927137973, 0.275203152606767309507063146157}, + {0.961174734657714080476864637603, 0.275940445487197150153946267892}, + {0.960962808290309777881077479833, 0.276677576038972417027395067635}, + {0.960750316613243948715705755603, 0.277414543828458093344124790747}, + {0.960537259751520045014672177786, 0.278151348422115085590178296115}, + {0.960323637830473919585472231120, 0.278887989386500279032077287411}, + {0.960109450975773937031476634729, 0.279624466288266593227973544344}, + {0.959894699313420529662721492059, 0.280360778694163814694917391535}, + {0.959679382969746752607420603454, 0.281096926171038263841950310962}, + {0.959463502071417506655848228547, 0.281832908285833350081617254546}, + {0.959247056745430093371851398842, 0.282568724605589738363420337919}, + {0.959030047119113659981337605132, 0.283304374697445737751877459232}, + {0.958812473320129310394577260013, 0.284039858128637190404219836637}, + {0.958594335476470216228506160405, 0.284775174466498304237660477156}, + {0.958375633716461172717515637487, 0.285510323278461264351335557876}, + {0.958156368168758820758057481726, 0.286245304132057121204724126073}, + {0.957936538962351424864039017848, 0.286980116594915568573043174183}, + {0.957716146226558873166823104839, 0.287714760234765165591852564830}, + {0.957495190091032566392925673426, 0.288449234619434224935474730955}, + {0.957273670685755195819410801050, 0.289183539316850202194331131977}, + {0.957051588141040965318495636893, 0.289917673895040750586815647694}, + {0.956828942587535369312945476850, 0.290651637922133221358933496958}, + {0.956605734156215081753771301010, 0.291385430966355662985023400324}, + {0.956381962978387734075624848629, 0.292119052596036377078547729980}, + {0.956157629185692137241403543158, 0.292852502379604806570512209873}, + {0.955932732910098281742250492243, 0.293585779885591202642558528169}, + {0.955707274283906560441437250120, 0.294318884682627401883081574852}, + {0.955481253439748767775085980247, 0.295051816339446715264926979216}, + {0.955254670510586989529144830158, 0.295784574424884261212298497412}, + {0.955027525629714157950900244032, 0.296517158507877465201119093763}, + {0.954799818930753718682069575152, 0.297249568157465837714426015737}, + {0.954571550547659630758801085904, 0.297981802942791806909639262813}, + {0.954342720614716477633976410289, 0.298713862433100330040502967677}, + {0.954113329266538801043395778834, 0.299445746197739892657807558862}, + {0.953883376638071767139592793683, 0.300177453806161953497877448171}, + {0.953652862864590500358019653504, 0.300908984827921888172141962059}, + {0.953421788081700305461652078520, 0.301640338832678767122530416600}, + {0.953190152425336667540989310510, 0.302371515390195966244135661327}, + {0.952957956031764696902541800227, 0.303102514070341055862911616714}, + {0.952725199037579573158041057468, 0.303833334443086355847185586754}, + {0.952491881579706323179834726034, 0.304563976078509102141111952733}, + {0.952258003795399599056281658704, 0.305294438546791668809277098262}, + {0.952023565822243567069449454721, 0.306024721418221790081304334308}, + {0.951788567798152129739719384816, 0.306754824263192782396458824223}, + {0.951553009861368592758879003668, 0.307484746652204099515159896328}, + {0.951316892150465553967819687387, 0.308214488155861054963224887615}, + {0.951080214804345014378839096025, 0.308944048344875710210288843882}, + {0.950842977962238156131036248553, 0.309673426790066375069443438406}, + {0.950605181763705342490311522852, 0.310402623062358717920261597101}, + {0.950366826348635784782459268172, 0.311131636732785266108436417198}, + {0.950127911857248097504680117709, 0.311860467372486016568444711083}, + {0.949888438430089299124858825962, 0.312589114552708713379303162583}, + {0.949648406208035478215379043831, 0.313317577844809014298022020739}, + {0.949407815332291571408518393582, 0.314045856820250712804210024842}, + {0.949166665944390697262633693754, 0.314773951050606071166981791976}, + {0.948924958186195155462883121800, 0.315501860107555986978411510790}, + {0.948682692199895094553596663900, 0.316229583562890326220440329053}, + {0.948439868128009622161300740117, 0.316957120988508145309481278673}, + {0.948196486113385583749391116726, 0.317684471956417968652175431998}, + {0.947952546299198672841157531366, 0.318411636038737788645391901809}, + {0.947708048828952098752154142858, 0.319138612807695898343496310190}, + {0.947462993846477696813224156358, 0.319865401835630502880292169721}, + {0.947217381495934818147475198202, 0.320592002694990330091684427316}, + {0.946971211921810884781791628484, 0.321318414958334852560284389256}, + {0.946724485268921167602229616023, 0.322044638198334509660014646215}, + {0.946477201682408675331714675849, 0.322770671987770707556109073266}, + {0.946229361307743821463134281657, 0.323496515899536707383532530002}, + {0.945980964290724757326245253353, 0.324222169506636959113166085444}, + {0.945732010777477150043068832019, 0.324947632382188433819436568228}, + {0.945482500914453738438680829859, 0.325672904099419846524199328996}, + {0.945232434848434999175026405283, 0.326397984231672488864006709264}, + {0.944981812726528147550197900273, 0.327122872352400506645864197708}, + {0.944730634696167803632249615475, 0.327847568035170844336079198911}, + {0.944478900905115548169987960136, 0.328572070853663744660622114679}, + {0.944226611501459811570668989589, 0.329296380381672748605126344046}, + {0.943973766633615984922300867765, 0.330020496193105417059854289619}, + {0.943720366450326197949038942170, 0.330744417861982886730487507521}, + {0.943466411100659319011185743875, 0.331468144962440869338848870029}, + {0.943211900734010622038283599977, 0.332191677068729152022541484257}, + {0.942956835500102119596022021142, 0.332915013755212652046822086049}, + {0.942701215548981896752422926511, 0.333638154596370861693088727407}, + {0.942445041031024888233957881312, 0.334361099166798736437300476609}, + {0.942188312096931768202523471700, 0.335083847041206583927674955703}, + {0.941931028897729616389256079856, 0.335806397794420452562746959302}, + {0.941673191584771362983019571402, 0.336528751001382409047124610879}, + {0.941414800309736343741917607986, 0.337250906237150593902640594024}, + {0.941155855224629189770269022119, 0.337972863076899721068713233763}, + {0.940896356481780826719329979824, 0.338694621095921188924648959073}, + {0.940636304233847586608874280500, 0.339416179869623357845398459176}, + {0.940375698633811540894100744481, 0.340137538973531716735010377306}, + {0.940114539834980278421028287994, 0.340858697983289438138143623291}, + {0.939852827990986683381890998135, 0.341579656474657156195462448522}, + {0.939590563255789268382045520411, 0.342300414023513521755148758530}, + {0.939327745783671397283853821136, 0.343020970205855535439809500531}, + {0.939064375729241951340497962519, 0.343741324597798492135325432173}, + {0.938800453247434774084467790090, 0.344461476775576536102363434111}, + {0.938535978493508560305258470180, 0.345181426315542549954074047491}, + {0.938270951623047189116277877474, 0.345901172794168987323359942820}, + {0.938005372791958835776426894881, 0.346620715788047317751363607385}, + {0.937739242156476970890821576177, 0.347340054873889136910491970411}, + {0.937472559873159250187768520846, 0.348059189628525611492904090483}, + {0.937205326098887958607974724146, 0.348778119628908422900082086926}, + {0.936937540990869899282245114591, 0.349496844452109545198226214779}, + {0.936669204706636171486877628922, 0.350215363675321578185162252339}, + {0.936400317404042059621360749588, 0.350933676875858358013005044995}, + {0.936130879241267033208373504749, 0.351651783631154568610099886428}, + {0.935860890376814635871483005758, 0.352369683518766629859442218731}, + {0.935590350969512374312841984647, 0.353087376116372475554072707382}, + {0.935319261178511607290886331612, 0.353804861001772052997438322564}, + {0.935047621163287434598032632493, 0.354522137752887434025694801676}, + {0.934775431083638697060678168782, 0.355239205947763314608067730660}, + {0.934502691099687865516898455098, 0.355956065164566848313398850223}, + {0.934229401371880818771842314163, 0.356672714981588256932809599675}, + {0.933955562060986732575429414283, 0.357389154977240941502003579444}, + {0.933681173328098412689257656893, 0.358105384730061593323569013592}, + {0.933406235334631517730485938955, 0.358821403818710860100793524907}, + {0.933130748242325225305648928043, 0.359537211821973068381907978619}, + {0.932854712213241121787632437190, 0.360252808318756889693901257488}, + {0.932578127409764423561000512564, 0.360968192888095229520217799291}, + {0.932300993994602755776668345788, 0.361683365109145837923421140658}, + {0.932023312130786485418809661496, 0.362398324561191309545193917074}, + {0.931745081981668721304856717325, 0.363113070823639472184396481680}, + {0.931466303710925092040895378886, 0.363827603476023497819369367789}, + {0.931186977482553746021665119770, 0.364541922098002124652538213923}, + {0.930907103460875129385954096506, 0.365256026269360323244228538897}, + {0.930626681810531763971994223539, 0.365969915570008741401153429251}, + {0.930345712696488469362066098256, 0.366683589579984925421740626916}, + {0.930064196284032362882499000989, 0.367397047879452709473468985379}, + {0.929782132738772193469856119918, 0.368110290048703048260136938552}, + {0.929499522226638563715539476107, 0.368823315668153905999560038254}, + {0.929216364913884040888092386012, 0.369536124318350645001629573017}, + {0.928932660967082823866292073944, 0.370248715579966358735219955634}, + {0.928648410553130521094544747029, 0.370961089033801982850491185673}, + {0.928363613839244372627490520244, 0.371673244260786517223493774509}, + {0.928078270992963139107700953900, 0.372385180841977359023076132871}, + {0.927792382182146324609561816033, 0.373096898358560635777791958390}, + {0.927505947574975175839995245042, 0.373808396391851205375900235595}, + {0.927218967339951793960040049569, 0.374519674523293211176877548496}, + {0.926931441645899134584851708496, 0.375230732334459915477964386810}, + {0.926643370661961229828307295975, 0.375941569407054421159131152308}, + {0.926354754557602855236098093883, 0.376652185322909560660775696306}, + {0.926065593502609307741124666791, 0.377362579663988340072933169722}, + {0.925775887667086738730404249509, 0.378072752012383994646427254338}, + {0.925485637221461487911255971994, 0.378782701950320543904382475375}, + {0.925194842336480527400510709413, 0.379492429060152625108770507723}, + {0.924903503183210906612998769560, 0.380201932924366048371922488514}, + {0.924611619933039974306154817896, 0.380911213125578074212285173417}, + {0.924319192757675156535412952508, 0.381620269246537358043269705377}, + {0.924026221829143845631904241600, 0.382329100870124505284763927193}, + {0.923732707319793289180154260976, 0.383037707579352071363132381521}, + {0.923438649402290367973478169006, 0.383746088957365005800426160931}, + {0.923144048249621929080888094177, 0.384454244587440818747836601688}, + {0.922848904035094119713278359995, 0.385162174052989858541451440033}, + {0.922553216932332831312635335053, 0.385869876937555311702254812189}, + {0.922256987115283033418222657929, 0.386577352824813924581093260713}, + {0.921960214758209217755791087257, 0.387284601298575836825222040716}, + {0.921662900035694732103763726627, 0.387991621942784858934061276159}, + {0.921365043122642335404748337169, 0.388698414341519193904161966202}, + {0.921066644194273642654025024967, 0.389404978078990937628844903884}, + {0.920767703426128791832638853521, 0.390111312739546911565469144989}, + {0.920468220994067110041214618832, 0.390817417907668496201978314275}, + {0.920168197074266336343839611800, 0.391523293167972408213017843082}, + {0.919867631843222954834971005766, 0.392228938105210311881876350526}, + {0.919566525477751528505621081422, 0.392934352304269485234300418597}, + {0.919264878154985365377172001899, 0.393639535350172875549645823412}, + {0.918962690052375630322956112650, 0.394344486828079598961238616539}, + {0.918659961347691900179768254020, 0.395049206323284773922921431222}, + {0.918356692219021719658655911189, 0.395753693421220076320565794958}, + {0.918052882844770379300314289139, 0.396457947707453906005525823275}, + {0.917748533403661248541993700201, 0.397161968767691608839243144757}, + {0.917443644074735220605987251474, 0.397865756187775754249003057339}, + {0.917138215037350712499630844832, 0.398569309553686301761388222076}, + {0.916832246471183887059908101946, 0.399272628451540989580337281950}, + {0.916525738556228208864240514231, 0.399975712467595334587144861871}, + {0.916218691472794222185882517806, 0.400678561188243242963125112510}, + {0.915911105401509884060828881047, 0.401381174200016788145006785271}, + {0.915602980523320231220907317038, 0.402083551089586987981050469898}, + {0.915294317019487047026871096023, 0.402785691443763527175292438187}, + {0.914985115071589305557608895469, 0.403487594849495312399056956565}, + {0.914675374861522394454027562460, 0.404189260893870694335561211119}, + {0.914365096571498559008261963754, 0.404890689164117578702217770115}, + {0.914054280384046569096767598239, 0.405591879247603870339844434056}, + {0.913742926482011386113413209387, 0.406292830731837362190361773173}, + {0.913431035048554718080993097828, 0.406993543204466512452910365027}, + {0.913118606267154242495109883748, 0.407694016253280111516943406968}, + {0.912805640321603495301872044365, 0.408394249466208003607192722484}, + {0.912492137396012648054011151544, 0.409094242431320975761366298684}, + {0.912178097674807175643252321606, 0.409793994736831146408206905107}, + {0.911863521342728522434128990426, 0.410493505971092409456701943782}, + {0.911548408584833991241680450912, 0.411192775722600156740327292937}, + {0.911232759586496188219939540431, 0.411891803579992166195467007128}, + {0.910916574533403355928840028355, 0.412590589132048213283354698433}, + {0.910599853611558929245006765996, 0.413289131967690959168493236575}, + {0.910282597007281757406360611640, 0.413987431675985395607142436347}, + {0.909964804907205659922908580484, 0.414685487846140010681494914024}, + {0.909646477498279537599046307150, 0.415383300067506233688163774787}, + {0.909327614967767261511255583173, 0.416080867929579212294299850328}, + {0.909008217503247450963499431964, 0.416778191021997646004138005082}, + {0.908688285292613362464919646300, 0.417475268934544285759358217547}, + {0.908367818524072889729836788320, 0.418172101257146322517144199082}, + {0.908046817386148341633145264495, 0.418868687579875054183276006370}, + {0.907725282067676442210313325631, 0.419565027492946884812852204050}, + {0.907403212757808108612778141833, 0.420261120586722880521080014660}, + {0.907080609646008451107945802505, 0.420956966451709435617090093729}, + {0.906757472922056551034586391324, 0.421652564678558328115087761034}, + {0.906433802776045460802833986236, 0.422347914858067052801260388151}, + {0.906109599398381981849581734423, 0.423043016581179043278382323479}, + {0.905784862979786553616179389792, 0.423737869438983838499268586020}, + {0.905459593711293253548433312972, 0.424432473022717415833682252924}, + {0.905133791784249686074304008798, 0.425126826923762357601788153261}, + {0.904807457390316538514696276252, 0.425820930733648239652211486828}, + {0.904480590721468247217273983551, 0.426514784044051520339735361631}, + {0.904153191969991776311132980481, 0.427208386446796317681418031498}, + {0.903825261328487505885220798518, 0.427901737533854076289685508527}, + {0.903496798989868454832219413220, 0.428594836897344400039600031960}, + {0.903167805147360724937755094288, 0.429287684129534607979650218113}, + {0.902838279994502834746583630476, 0.429980278822840622510170760506}, + {0.902508223725145941607195254619, 0.430672620569826802849888736091}, + {0.902177636533453619627209718601, 0.431364708963206333613982224051}, + {0.901846518613901748651073830843, 0.432056543595841502369836462094}, + {0.901514870161278736304666381329, 0.432748124060743699637043846451}, + {0.901182691370684518794575978973, 0.433439449951074085021218706970}, + {0.900849982437531449086520751734, 0.434130520860143309658241150828}, + {0.900516743557543519749231109017, 0.434821336381412293370374300139}, + {0.900182974926756807043659591727, 0.435511896108492002621659366923}, + {0.899848676741518582744561172149, 0.436202199635143950118276734429}, + {0.899513849198487980274308029038, 0.436892246555280361341999650904}, + {0.899178492494635328569074772531, 0.437582036462964396594799154627}, + {0.898842606827242374123443369172, 0.438271568952410428554600230200}, + {0.898506192393901947923495754367, 0.438960843617984319831037964832}, + {0.898169249392518076469116294902, 0.439649860054203478476608779602}, + {0.897831778021305648707084401394, 0.440338617855737246564729048259}, + {0.897493778478790305008772065776, 0.441027116617407233256642484776}, + {0.897155250963808548192446323810, 0.441715355934187314801420143340}, + {0.896816195675507299434059405030, 0.442403335401204078625170268424}, + {0.896476612813344120311853657768, 0.443091054613736878842189526040}, + {0.896136502577086768717151699093, 0.443778513167218224833021622544}, + {0.895795865166813531921263802360, 0.444465710657234003289062229669}, + {0.895454700782912449419370659598, 0.445152646679523644746012678297}, + {0.895113009626081757019733231573, 0.445839320829980290117333652233}, + {0.894770791897329553776785360242, 0.446525732704651345805757500784}, + {0.894428047797973801991133768752, 0.447211881899738317169834544984}, + {0.894084777529641994142650673894, 0.447897768011597308124294158915}, + {0.893740981294271041868171323586, 0.448583390636739243184649694740}, + {0.893396659294107720050703846937, 0.449268749371829922978349713958}, + {0.893051811731707445574102166574, 0.449953843813690523845139068726}, + {0.892706438809935387546090623800, 0.450638673559297597837058901860}, + {0.892360540731965357075239353435, 0.451323238205783516807656496894}, + {0.892014117701280473404779058910, 0.452007537350436416900834046828}, + {0.891667169921672275734181312146, 0.452691570590700920195814660474}, + {0.891319697597241389352973328641, 0.453375337524177746129083743654}, + {0.890971700932396859506923192384, 0.454058837748624433139355005551}, + {0.890623180131855929353434930817, 0.454742070861955449689872921226}, + {0.890274135400644595073060827417, 0.455425036462242360801866425390}, + {0.889924566944096717691081721568, 0.456107734147714105610305068694}, + {0.889574474967854578189019321144, 0.456790163516757163897352711501}, + {0.889223859677868211370821427408, 0.457472324167916055692728605209}, + {0.888872721280395627907466860051, 0.458154215699893063717951235958}, + {0.888521059982002259225453144609, 0.458835837711549121564758024761}, + {0.888168875989561734662913750071, 0.459517189801903480628197939950}, + {0.887816169510254438179686076182, 0.460198271570134320729295041019}, + {0.887462940751568840624941003625, 0.460879082615578694603897247362}, + {0.887109189921300167469553343835, 0.461559622537733083014188650850}, + {0.886754917227550842895311689063, 0.462239890936253339237538284578}, + {0.886400122878730600817220874887, 0.462919887410955077644558741667}, + {0.886044807083555596705082280096, 0.463599611561814006766013562810}, + {0.885688970051048962695006139256, 0.464279062988965762759363542500}, + {0.885332611990540585544806617690, 0.464958241292706686564883966639}, + {0.884975733111666662544791961409, 0.465637146073493657372210918766}, + {0.884618333624369923562369422143, 0.466315776931944425687248667600}, + {0.884260413738899186952835407283, 0.466994133468838001910228285851}, + {0.883901973665809470581677942391, 0.467672215285114767358010112730}, + {0.883543013615961880802274208691, 0.468350021981876529775234985209}, + {0.883183533800523390411285618029, 0.469027553160387133956987781858}, + {0.882823534430966616604052887851, 0.469704808422072517259948654100}, + {0.882463015719070154041503428743, 0.470381787368520654091241794958}, + {0.882101977876917575649429181794, 0.471058489601482499598006370434}, + {0.881740421116898320796906318719, 0.471734914722871434555884206929}, + {0.881378345651706918140178004251, 0.472411062334764042525137028861}, + {0.881015751694342874600351933623, 0.473086932039400054339495227396}, + {0.880652639458111008430307720118, 0.473762523439182847706518941777}, + {0.880289009156621005125487045007, 0.474437836136679225162993134290}, + {0.879924861003786862312381344964, 0.475112869734620302253347290389}, + {0.879560195213827888949253974715, 0.475787623835901118951596799889}, + {0.879195012001267484080813119363, 0.476462098043581194772855269548}, + {0.878829311580933358882816719415, 0.477136291960884806329090679355}, + {0.878463094167957869728979858337, 0.477810205191200987329125382530}, + {0.878096359977777130012555062422, 0.478483837338083972667845955584}, + {0.877729109226131565257844613370, 0.479157188005253309448505660839}, + {0.877361342129065135964083310682, 0.479830256796594190049631833972}, + {0.876993058902925892716950784234, 0.480503043316157507636177115273}, + {0.876624259764365310054756719182, 0.481175547168160300248729299710}, + {0.876254944930338508513045781001, 0.481847767956986028359267493215}, + {0.875885114618103810535387765412, 0.482519705287184352826557187655}, + {0.875514769045222851495680060907, 0.483191358763471856541116267181}, + {0.875143908429560357653542723710, 0.483862727990732266469819933263}, + {0.874772532989284146154318477784, 0.484533812574016176100144548400}, + {0.874400642942864791962165327277, 0.485204612118541822596284873725}, + {0.874028238509075738882359019044, 0.485875126229695253332607762786}, + {0.873655319906992633427478267549, 0.486545354513030270382500930282}, + {0.873281887355994212995824454993, 0.487215296574268763585280339612}, + {0.872907941075761084626094543637, 0.487884952019301043613097590423}, + {0.872533481286276169086590925872, 0.488554320454186175037847306157}, + {0.872158508207824478830616499181, 0.489223401485151976331167134049}, + {0.871783022060993117996474666143, 0.489892194718595186397891438901}, + {0.871407023066670949340561946883, 0.490560699761082019687563615662}, + {0.871030511446048261170460591529, 0.491228916219348277216738551942}, + {0.870653487420617433478753355303, 0.491896843700299291057831396756}, + {0.870275951212171938742301335878, 0.492564481811010590472932335615}, + {0.869897903042806341922243973386, 0.493231830158727901913806590528}, + {0.869519343134916855575511362986, 0.493898888350867482088801807549}, + {0.869140271711200562698707017262, 0.494565655995015951429394363004}, + {0.868760688994655305705805403704, 0.495232132698931182268609063613}, + {0.868380595208579797450454407226, 0.495898318070542187818716683978}, + {0.867999990576573510203672867647, 0.496564211717949288704687660356}, + {0.867618875322536231564640729630, 0.497229813249424223986494553174}, + {0.867237249670668397527606430231, 0.497895122273410872804078053377}, + {0.866855113845470426348072123801, 0.498560138398525143355044519922}, + {0.866472468071743051609701069538, 0.499224861233555083916968442281}, + {0.866089312574586767112805318902, 0.499889290387461326936602290516}, + {0.865705647579402381985858028202, 0.500553425469377422096783902816}, + {0.865321473311889799440166370914, 0.501217266088609947338738948019}, + {0.864936789998049015970593700331, 0.501880811854638286817476000579}, + {0.864551597864179344199442311947, 0.502544062377115685613659934461}, + {0.864165897136879301854150980944, 0.503207017265868916666704535601}, + {0.863779688043046722789597424708, 0.503869676130898946908587276994}, + {0.863392970809878423921190915280, 0.504532038582380271130034543603}, + {0.863005745664870316247174741875, 0.505194104230662244248151182546}, + {0.862618012835816738714811435784, 0.505855872686268859261815578066}, + {0.862229772550811235376500007987, 0.506517343559898525207074726495}, + {0.861841025038245334144448861480, 0.507178516462425177380168861418}, + {0.861451770526809323946793028881, 0.507839391004897722226019141090}, + {0.861062009245491477571476934827, 0.508499966798540925516647348559}, + {0.860671741423578384733161783515, 0.509160243454754635195058654062}, + {0.860280967290654507984015708644, 0.509820220585115446709778552759}, + {0.859889687076602293736016235925, 0.510479897801375703814130702085}, + {0.859497901011601728171740433027, 0.511139274715464386744656621886}, + {0.859105609326130448266667372081, 0.511798350939486890176510769379}, + {0.858712812250963519744573204662, 0.512457126085725689357275314251}, + {0.858319510017173437077531161776, 0.513115599766640562151565063687}, + {0.857925702856129790419004166324, 0.513773771594868033929515149794}, + {0.857531390999499154581542370579, 0.514431641183222820856713042303}, + {0.857136574679244978014480693673, 0.515089208144697163760383773479}, + {0.856741254127627471781636359083, 0.515746472092461383240902250691}, + {0.856345429577203609561308894627, 0.516403432639863990694095718936}, + {0.855949101260826905601675207436, 0.517060089400431910355848685867}, + {0.855552269411646859609277271375, 0.517716441987871145435917696886}, + {0.855154934263109622882836902136, 0.518372490016066111984116560052}, + {0.854757096048957221157138519629, 0.519028233099080860135643433750}, + {0.854358755003227443580726685468, 0.519683670851158407977266051603}, + {0.853959911360254175782813490514, 0.520338802886721962792648810137}, + {0.853560565354666844761766242300, 0.520993628820373921861630606145}, + {0.853160717221390418885107465030, 0.521648148266897093705551924359}, + {0.852760367195645296867212437064, 0.522302360841254587064952374931}, + {0.852359515512947085724704265886, 0.522956266158590143966478080984}, + {0.851958162409106378731848963071, 0.523609863834227917678276753577}, + {0.851556308120228977465160369320, 0.524263153483673360888417391834}, + {0.851153952882715336691887841880, 0.524916134722613003660285357910}, + {0.850751096933260786414621179574, 0.525568807166914675477187302022}, + {0.850347740508854976759778310225, 0.526221170432628060353863475029}, + {0.849943883846782211044512678200, 0.526873224135984585814185265917}, + {0.849539527184620890665200931835, 0.527524967893398200047272439406}, + {0.849134670760243626119745385949, 0.528176401321464372706770973309}, + {0.848729314811817125985271559330, 0.528827524036961871267692458787}, + {0.848323459577801641806615862151, 0.529478335656851983870296862733}, + {0.847917105296951412185535446042, 0.530128835798278963409302377841}, + {0.847510252208314329713800816535, 0.530779024078570138556187885115}, + {0.847102900551231496883985983004, 0.531428900115236801937612654001}, + {0.846695050565337448134073383699, 0.532078463525973544001601567288}, + {0.846286702490559705758244035678, 0.532727713928658808129057433689}, + {0.845877856567119001951482459845, 0.533376650941355334722970837902}, + {0.845468513035528834720366830879, 0.534025274182310383253025065642}, + {0.845058672136595467883068977244, 0.534673583269955510210991178610}, + {0.844648334111417820047051918664, 0.535321577822907124222240327072}, + {0.844237499201387020519860016066, 0.535969257459966708090348674887}, + {0.843826167648186742376026359125, 0.536616621800121040841702324542}, + {0.843414339693792758367862916202, 0.537263670462542530792404704698}, + {0.843002015580472940925460534345, 0.537910403066588882481369182642}, + {0.842589195550786707045176626707, 0.538556819231804095871041226928}, + {0.842175879847585573401147485129, 0.539202918577918244302793482348}, + {0.841762068714012490211473505042, 0.539848700724847585519228232442}, + {0.841347762393501952260521647986, 0.540494165292695227797992174601}, + {0.840932961129779776854320516577, 0.541139311901750796884869032510}, + {0.840517665166862548709048041928, 0.541784140172491546216804181313}, + {0.840101874749058397107148721261, 0.542428649725581246698880022450}, + {0.839685590120966107718913917779, 0.543072840181871741016550458880}, + {0.839268811527475233624784323183, 0.543716711162402277501826119988}, + {0.838851539213765762248442570126, 0.544360262288400398311694061704}, + {0.838433773425308337401418157242, 0.545003493181281162272000528901}, + {0.838015514407863815193877599086, 0.545646403462648588167382968095}, + {0.837596762407483041990019501100, 0.546288992754295210652060177381}, + {0.837177517670507298497284409677, 0.546931260678202191272134768951}, + {0.836757780443567189543330187007, 0.547573206856539762554803019157}, + {0.836337550973583532254451711196, 0.548214830911667783119867181085}, + {0.835916829507766356854858713632, 0.548856132466135293590525634499}, + {0.835495616293615350755885629042, 0.549497111142680960682582735899}, + {0.835073911578919414466781745432, 0.550137766564233632315961131098}, + {0.834651715611756439550106279057, 0.550778098353912115570096830197}, + {0.834229028640493419644030836935, 0.551418106135026064862358907703}, + {0.833805850913786339440036954329, 0.552057789531074982747327339894}, + {0.833382182680579730593706244690, 0.552697148165749774229027480033}, + {0.832958024190106671724720399652, 0.553336181662932302671720208309}, + {0.832533375691888677394558726519, 0.553974889646695500822204394353}, + {0.832108237435735587084195685748, 0.554613271741304036943631672330}, + {0.831682609671745121104891040886, 0.555251327571213981748599053390}, + {0.831256492650303213665097246121, 0.555889056761073807599871088314}, + {0.830829886622083568781249596213, 0.556526458935723611354262629902}, + {0.830402791838047549255463763984, 0.557163533720196224585663458129}, + {0.829975208549443954630930875283, 0.557800280739716991540433355112}, + {0.829547137007808910169615046470, 0.558436699619704102204309492663}, + {0.829118577464965977874555846938, 0.559072789985768481280103969766}, + {0.828689530173025823422960911557, 0.559708551463714676366123512707}, + {0.828259995384385661054693628103, 0.560343983679540857956169475074}, + {0.827829973351729919706087912346, 0.560979086259438153305723062658}, + {0.827399464328029465853830970445, 0.561613858829792422788784733712}, + {0.826968468566541603514963298949, 0.562248301017183149674849573785}, + {0.826536986320809963224576222274, 0.562882412448384439329629458371}, + {0.826105017844664613058114355226, 0.563516192750364797170448127872}, + {0.825672563392221392497560827906, 0.564149641550287683777753500181}, + {0.825239623217882245498344673251, 0.564782758475511403872815208160}, + {0.824806197576334332310921126918, 0.565415543153589661429236912227}, + {0.824372286722551250726098714949, 0.566047995212271448650653837831}, + {0.823937890911791370740502316039, 0.566680114279501601082245088037}, + {0.823503010399598500690387936629, 0.567311899983420797610733643523}, + {0.823067645441801665207037785876, 0.567943351952365560464386362582}, + {0.822631796294514994194457813137, 0.568574469814869143391433681245}, + {0.822195463214137167717865395389, 0.569205253199661198593162225734}, + {0.821758646457351749070596724778, 0.569835701735667998768519737496}, + {0.821321346281126740684896958555, 0.570465815052012992225627385778}, + {0.820883562942714584131920219079, 0.571095592778016691859477305115}, + {0.820445296699652049099427131296, 0.571725034543197119241142445389}, + {0.820006547809759678280272510165, 0.572354139977269915640079034347}, + {0.819567316531142231461615210719, 0.572982908710148564068731502630}, + {0.819127603122188241435708278004, 0.573611340371944611327137408807}, + {0.818687407841569680932991559530, 0.574239434592967890047532364406}, + {0.818246730948242073644394167786, 0.574867191003726740738954958942}, + {0.817805572701444272176729555213, 0.575494609234928122809549222438}, + {0.817363933360698458052695514198, 0.576121688917478280700379400514}, + {0.816921813185809475577059401985, 0.576748429682482410818522566842}, + {0.816479212436865386948170453252, 0.577374831161244883581673548179}, + {0.816036131374236806124145005015, 0.578000892985269909551959699456}, + {0.815592570258576787800564034114, 0.578626614786261428413638441270}, + {0.815148529350820827410473157215, 0.579251996196123553062307109940}, + {0.814704008912187083168987555837, 0.579877036846960347560298032477}, + {0.814259009204175265850267351198, 0.580501736371076493270493301679}, + {0.813813530488567193899029916793, 0.581126094400977621923232163681}, + {0.813367573027426571385944953363, 0.581750110569369649482496242854}, + {0.812921137083098765963029563864, 0.582373784509160108413539091998}, + {0.812474222918210475796740865917, 0.582997115853457703593676342280}, + {0.812026830795669729567975991813, 0.583620104235572756401495553291}, + {0.811578960978665886472072088509, 0.584242749289016982672251288022}, + {0.811130613730669192129596467566, 0.584865050647504491898587275500}, + {0.810681789315430778586346605152, 0.585487007944951343141326560726}, + {0.810232487996982331246442754491, 0.586108620815476433207891204802}, + {0.809782710039636532961537795927, 0.586729888893400386429277659772}, + {0.809332455707985953807792611769, 0.587350811813247664083803556423}, + {0.808881725266903606197388398868, 0.587971389209745010084873229061}, + {0.808430518981542722833921743586, 0.588591620717822894270909728220}, + {0.807978837117336312623194771732, 0.589211505972614957293842508079}, + {0.807526679939997160673215148563, 0.589831044609458787775224664074}, + {0.807074047715517606249591153755, 0.590450236263895811283930470381}, + {0.806620940710169653797834143916, 0.591069080571671401358457842434}, + {0.806167359190504417831846240006, 0.591687577168735434618440649501}, + {0.805713303423352233956222789857, 0.592305725691242290764648714685}, + {0.805258773675822214777042518108, 0.592923525775551296668197664985}, + {0.804803770215302916035682301299, 0.593540977058226393303641543753}, + {0.804348293309460782296582692652, 0.594158079176036801882787585782}, + {0.803892343226241257170272547228, 0.594774831765957578966208529891}, + {0.803435920233868117179554246832, 0.595391234465168728284822918795}, + {0.802979024600843249714898774982, 0.596007286911056533007524649292}, + {0.802521656595946430989840791881, 0.596622988741213222674275584723}, + {0.802063816488235437063281096925, 0.597238339593437417285315405024}, + {0.801605504547046154861789091228, 0.597853339105733905256556681707}, + {0.801146721041991360934275689942, 0.598467986916314309553399652941}, + {0.800687466242961609630413022387, 0.599082282663597309735337148595}, + {0.800227740420124789011424581986, 0.599696225986208308889047202683}, + {0.799767543843925676760875376203, 0.600309816522980432829115216009}, + {0.799306876785086162229276851576, 0.600923053912954086008824106102}, + {0.798845739514604580300272118620, 0.601535937795377728676271544828}, + {0.798384132303756377524450726924, 0.602148467809707210740555183293}, + {0.797922055424093001896324039990, 0.602760643595607215061704664549}, + {0.797459509147442457965837547818, 0.603372464792950258249959460954}, + {0.796996493745908751726858554321, 0.603983931041818022933398424357}, + {0.796533009491872001639478639845, 0.604595041982500358557217623456}, + {0.796069056657987994540803811105, 0.605205797255496502629057431477}, + {0.795604635517188074622652038670, 0.605816196501514969696700063650}, + {0.795139746342679587520763107023, 0.606426239361473551348069577216}, + {0.794674389407944548047169064375, 0.607035925476499649278139258968}, + {0.794208564986740639390916385310, 0.607645254487930830400443937833}, + {0.793742273353100213917343808134, 0.608254226037314493780172597326}, + {0.793275514781330626234989722434, 0.608862839766408203701075763092}, + {0.792808289546014122173289706552, 0.609471095317180244776977815491}, + {0.792340597922007172648761752498, 0.610078992331809621951776989590}, + {0.791872440184440473665006265946, 0.610686530452686282544050300203}, + {0.791403816608719501424218378816, 0.611293709322410894202448616852}, + {0.790934727470523291081860861595, 0.611900528583796066151023751445}, + {0.790465173045804880835873973410, 0.612506987879865572033111220662}, + {0.789995153610791089882070536987, 0.613113086853854905022842558537}, + {0.789524669441982185347228551109, 0.613718825149211721914355166518}, + {0.789053720816151882289091190614, 0.614324202409595954144094775984}, + {0.788582308010347121651761881367, 0.614929218278879585746210523212}, + {0.788110431301888070265704300255, 0.615533872401147319486369724473}, + {0.787638090968367454713927600096, 0.616138164420696909928665263578}, + {0.787165287287651005421196259704, 0.616742093982038719346405741817}, + {0.786692020537876790520215308788, 0.617345660729896827945140103111}, + {0.786218290997455659940840178024, 0.617948864309208145684237933892}, + {0.785744098945070357231656998920, 0.618551704365123744544519013289}, + {0.785269444659675852626889991370, 0.619154180543008414439043463062}, + {0.784794328420499232024099001137, 0.619756292488440663213111747609}, + {0.784318750507038919828062262241, 0.620358039847213715844986836601}, + {0.783842711199065234062288709538, 0.620959422265335181378986817435}, + {0.783366210776619720235203203629, 0.621560439389027274970089820272}, + {0.782889249520015484407053918403, 0.622161090864726817883934018028}, + {0.782411827709836527056097565946, 0.622761376339086347719842251536}, + {0.781933945626937632056296934024, 0.623361295458973230232402329420}, + {0.781455603552444588721925811114, 0.623960847871470658532189190737}, + {0.780976801767753747718359136343, 0.624560033223877208996555054910}, + {0.780497540554531910039770536969, 0.625158851163707618425746659341}, + {0.780017820194715993942224940838, 0.625757301338692895065207721927}, + {0.779537640970513256988283501414, 0.626355383396779985538671553513}, + {0.779057003164400629913188822684, 0.626953096986132663026580758014}, + {0.778575907059125049691772346705, 0.627550441755131527266087232420}, + {0.778094352937702793404639578512, 0.628147417352374004551052166789}, + {0.777612341083420033349682398693, 0.628744023426674680798953431804}, + {0.777129871779831615796751975722, 0.629340259627065634617792966310}, + {0.776646945310762060188380928594, 0.629936125602796437306096777320}, + {0.776163561960304337894456239155, 0.630531621003334596942124790075}, + {0.775679722012820649368336489715, 0.631126745478365336339265923016}, + {0.775195425752941424946129700402, 0.631721498677792259179852862871}, + {0.774710673465565546891298254195, 0.632315880251737572059766989696}, + {0.774225465435860682461566284474, 0.632909889850541751421530989319}, + {0.773739801949261840618987662310, 0.633503527124764320710426090955}, + {0.773253683291472593275273084146, 0.634096791725183739352189604688}, + {0.772767109748463854046462984115, 0.634689683302797735819922309020}, + {0.772280081606474322342137384112, 0.635282201508823418656390913384}, + {0.771792599152010150298508506239, 0.635874345994697720563237908209}, + {0.771304662671844831756118310295, 0.636466116412077176356376639887}, + {0.770816272453018536126023718680, 0.637057512412838589099806085869}, + {0.770327428782838885545913854003, 0.637648533649078808061005929630}, + {0.769838131948879844657085413928, 0.638239179773115283822448873252}, + {0.769348382238982275715954983752, 0.638829450437486290326205562451}, + {0.768858179941253272460244261310, 0.639419345294950702829339661548}, + {0.768367525344066271131282519491, 0.640008863998488441993117703532}, + {0.767876418736060606384796756174, 0.640598006201301028994521402637}, + {0.767384860406141733335516619263, 0.641186771556811252459340266796}, + {0.766892850643480672445662094106, 0.641775159718663501529078985186}, + {0.766400389737514231569548428524, 0.642363170340724320972469740809}, + {0.765907477977944339819771357725, 0.642950803077082078118564822944}, + {0.765414115654738269611812029325, 0.643538057582047740012853864755}, + {0.764920303058128414619432078325, 0.644124933510154540350356455747}, + {0.764426040478612067730068702076, 0.644711430516158312542529529310}, + {0.763931328206951087977927272732, 0.645297548255038377895687062846}, + {0.763436166534172011566283799766, 0.645883286381996324365672990098}, + {0.762940555751565718800577542424, 0.646468644552457782914700601395}, + {0.762444496150687212043806084694, 0.647053622422071539332932843536}, + {0.761947988023355393671920410270, 0.647638219646710311394599557389}, + {0.761451031661653621185337215138, 0.648222435882470415791090090352}, + {0.760953627357928152896704432351, 0.648806270785672545287070533959}, + {0.760455775404789258153925857187, 0.649389724012861657698181261367}, + {0.759957476095110329161741447024, 0.649972795220807531002549239929}, + {0.759458729722028214048634708888, 0.650555484066503875162368331075}, + {0.758959536578942439710715461842, 0.651137790207170330525343615591}, + {0.758459896959515433856324762019, 0.651719713300250913512456918397}, + {0.757959811157672302961429977586, 0.652301253003415459907898821257}, + {0.757459279467600721247322326235, 0.652882408974558847702951425163}, + {0.756958302183750486591407025116, 0.653463180871802329363617900526}, + {0.756456879600833742571808215871, 0.654043568353492643652202787052}, + {0.755955012013824423355856652051, 0.654623571078202681761126768833}, + {0.755452699717958253700089699123, 0.655203188704731820379834061896}, + {0.754949943008732637927948871948, 0.655782420892106032717094876716}, + {0.754446742181906437885174909752, 0.656361267299577999523307880736}, + {0.753943097533499639872900388582, 0.656939727586627109090500198363}, + {0.753439009359793576692254646332, 0.657517801412960123386142186064}, + {0.752934477957330150488246545137, 0.658095488438511178053147432365}, + {0.752429503622912387861276783951, 0.658672788323441893432175220369}, + {0.751924086653603551688718198420, 0.659249700728141485583932990266}, + {0.751418227346727474191823148431, 0.659826225313227321400688651920}, + {0.750911925999867890801908743015, 0.660402361739545029628573047376}, + {0.750405182910869328338776540477, 0.660978109668168056778370100801}, + {0.749897998377835328653873148141, 0.661553468760398888370843906159}, + {0.749390372699129558853314847511, 0.662128438677768715869831339660}, + {0.748882306173375145164072819171, 0.662703019082037436682242059760}, + {0.748373799099454561911670680274, 0.663277209635194098247268357227}, + {0.747864851776509409475579559512, 0.663851009999457342125595005200}, + {0.747355464503940192244613172079, 0.664424419837275181954794334160}, + {0.746845637581406540661532744707, 0.664997438811325336516233619477}, + {0.746335371308826323044627315539, 0.665570066584515451779680006439}, + {0.745824665986376089676923584193, 0.666142302819983544992510360316}, + {0.745313521914490517694673599181, 0.666714147181097671612803878816}, + {0.744801939393862633131959682942, 0.667285599331456369398551942140}, + {0.744289918725443255809182119265, 0.667856658934889324541472888086}, + {0.743777460210440888310756690771, 0.668427325655456816555499699462}, + {0.743264564150321604962812216399, 0.668997599157450273388292316668}, + {0.742751230846809051833190551406, 0.669567479105392493465842562728}, + {0.742237460601884002642236737302, 0.670136965164037645692474143289}, + {0.741723253717784136718194076821, 0.670706056998372157629262346745}, + {0.741208610497004261041809058952, 0.671274754273613494248706956569}, + {0.740693531242295755134819046361, 0.671843056655211934291571651556}, + {0.740178016256666237993044887844, 0.672410963808849793110766768223}, + {0.739662065843380012175600768387, 0.672978475400442088805164075893}, + {0.739145680305957508693381896592, 0.673545591096136098130386926641}, + {0.738628859948174842919854654610, 0.674112310562312355699532417930}, + {0.738111605074064258680266448209, 0.674678633465584542960868930095}, + {0.737593915987913573140133394190, 0.675244559472799266153231201315}, + {0.737075792994265732716030470328, 0.675810088251036944484440027736}, + {0.736557236397919146142498902918, 0.676375219467611588086697338440}, + {0.736038246503927351405138779228, 0.676939952790071131083493582992}, + {0.735518823617598904718306584982, 0.677504287886197431589607731439}, + {0.734998968044496714391300429270, 0.678068224424006604778014661861}, + {0.734478680090438373895267432090, 0.678631762071749355946792547911}, + {0.733957960061495939818598799320, 0.679194900497911202563727783854}, + {0.733436808263995709822324897686, 0.679757639371212030177105134499}, + {0.732915225004517778550905404700, 0.680319978360607202638732360356}, + {0.732393210589896037632229308656, 0.680881917135287229037032830092}, + {0.731870765327218286699917371152, 0.681443455364677874719347983046}, + {0.731347889523825567259507351991, 0.682004592718440827425752104318}, + {0.730824583487312162688454009185, 0.682565328866473253199842474714}, + {0.730300847525525487213826636435, 0.683125663478908684567159070866}, + {0.729776681946566085912309063133, 0.683685596226116576445974715170}, + {0.729252087058786968576384879270, 0.684245126778703083303412313398}, + {0.728727063170793831758942360466, 0.684804254807510615066235004633}, + {0.728201610591444614684064617904, 0.685362979983618725299265861395}, + {0.727675729629849610269332060852, 0.685921301978343556093875577062}, + {0.727149420595371021036612546595, 0.686479220463238948291007091029}, + {0.726622683797622848089758917922, 0.687036735110095664325058351096}, + {0.726095519546471002136911465641, 0.687593845590942165379999551078}, + {0.725567928152032304289775765938, 0.688150551578044833433978055837}, + {0.725039909924675374242042380502, 0.688706852743907749214713476249}, + {0.724511465175019631068664693885, 0.689262748761273469355614906817}, + {0.723982594213935515270463838533, 0.689818239303122471284268613090}, + {0.723453297352544377751826232270, 0.690373324042674041400857731787}, + {0.722923574902217702664586340688, 0.690928002653386164055859808286}, + {0.722393427174577551497236527211, 0.691482274808955854616954184166}, + {0.721862854481496341030322128063, 0.692036140183318715379812147148}, + {0.721331857135096288224929139687, 0.692589598450650378858028943796}, + {0.720800435447749188178079293721, 0.693142649285365397560099154362}, + {0.720268589732077191278847294598, 0.693695292362118243190138855425}, + {0.719736320300951026851521419303, 0.694247527355803306647885619896}, + {0.719203627467491224400930605043, 0.694799353941554898028698517010}, + {0.718670511545067225434024749120, 0.695350771794747690712767962395}, + {0.718136972847297494482177171449, 0.695901780590996832387418180588}, + {0.717603011688049075011974764493, 0.696452380006157834024804742512}, + {0.717068628381437478402915530751, 0.697002569716327458060334265610}, + {0.716533823241826683947408582753, 0.697552349397843163281152101263}, + {0.715998596583828694761564293003, 0.698101718727283770959957109881}, + {0.715462948722303759829799219006, 0.698650677381469464855001660908}, + {0.714926879972359485826416403143, 0.699199225037462124276999020367}, + {0.714390390649351392227117685252, 0.699747361372564991022215963312}, + {0.713853481068882467219793852564, 0.700295086064323779595497398986}, + {0.713316151546802612593012327125, 0.700842398790526122098754058243}, + {0.712778402399208976802924553340, 0.701389299229202234364777268638}, + {0.712240233942445510884056147916, 0.701935787058624360845726641855}, + {0.711701646493102968449306899856, 0.702481861957307995858457161376}, + {0.711162640368018350578438457887, 0.703027523604011217450704407383}, + {0.710623215884275016840376792970, 0.703572771677735575579504256893}, + {0.710083373359202796315514660819, 0.704117605857725314955075646139}, + {0.709543113110376766350384514226, 0.704662025823468818330752583279}, + {0.709002435455618251758380665706, 0.705206031254697829346866910782}, + {0.708461340712994158685944512399, 0.705749621831387785597655692982}, + {0.707919829200816308478749760980, 0.706292797233758484765075991163}, + {0.707377901237642103815517202747, 0.706835557142273751551897476020}, + {0.706835557142273862574199938535, 0.707377901237642103815517202747}, + {0.706292797233758484765075991163, 0.707919829200816308478749760980}, + {0.705749621831387785597655692982, 0.708461340712994047663642049883}, + {0.705206031254697829346866910782, 0.709002435455618251758380665706}, + {0.704662025823468929353055045794, 0.709543113110376766350384514226}, + {0.704117605857725425977378108655, 0.710083373359202685293212198303}, + {0.703572771677735575579504256893, 0.710623215884275016840376792970}, + {0.703027523604011217450704407383, 0.711162640368018350578438457887}, + {0.702481861957307995858457161376, 0.711701646493102968449306899856}, + {0.701935787058624360845726641855, 0.712240233942445510884056147916}, + {0.701389299229202234364777268638, 0.712778402399208865780622090824}, + {0.700842398790526233121056520758, 0.713316151546802612593012327125}, + {0.700295086064323779595497398986, 0.713853481068882467219793852564}, + {0.699747361372564991022215963312, 0.714390390649351392227117685252}, + {0.699199225037462124276999020367, 0.714926879972359374804113940627}, + {0.698650677381469575877304123424, 0.715462948722303648807496756490}, + {0.698101718727283881982259572396, 0.715998596583828694761564293003}, + {0.697552349397843274303454563778, 0.716533823241826572925106120238}, + {0.697002569716327458060334265610, 0.717068628381437478402915530751}, + {0.696452380006157834024804742512, 0.717603011688049075011974764493}, + {0.695901780590996832387418180588, 0.718136972847297494482177171449}, + {0.695350771794747801735070424911, 0.718670511545067225434024749120}, + {0.694799353941554898028698517010, 0.719203627467491224400930605043}, + {0.694247527355803306647885619896, 0.719736320300951026851521419303}, + {0.693695292362118354212441317941, 0.720268589732077080256544832082}, + {0.693142649285365508582401616877, 0.720800435447749188178079293721}, + {0.692589598450650378858028943796, 0.721331857135096177202626677172}, + {0.692036140183318826402114609664, 0.721862854481496341030322128063}, + {0.691482274808955854616954184166, 0.722393427174577551497236527211}, + {0.690928002653386275078162270802, 0.722923574902217702664586340688}, + {0.690373324042674041400857731787, 0.723453297352544377751826232270}, + {0.689818239303122471284268613090, 0.723982594213935515270463838533}, + {0.689262748761273469355614906817, 0.724511465175019520046362231369}, + {0.688706852743907749214713476249, 0.725039909924675374242042380502}, + {0.688150551578044833433978055837, 0.725567928152032304289775765938}, + {0.687593845590942165379999551078, 0.726095519546470891114609003125}, + {0.687036735110095664325058351096, 0.726622683797622848089758917922}, + {0.686479220463238948291007091029, 0.727149420595371021036612546595}, + {0.685921301978343667116178039578, 0.727675729629849610269332060852}, + {0.685362979983618725299265861395, 0.728201610591444503661762155389}, + {0.684804254807510615066235004633, 0.728727063170793720736639897950}, + {0.684245126778703083303412313398, 0.729252087058786968576384879270}, + {0.683685596226116687468277177686, 0.729776681946565974890006600617}, + {0.683125663478908795589461533382, 0.730300847525525376191524173919}, + {0.682565328866473253199842474714, 0.730824583487312051666151546669}, + {0.682004592718440827425752104318, 0.731347889523825456237204889476}, + {0.681443455364677985741650445561, 0.731870765327218286699917371152}, + {0.680881917135287340059335292608, 0.732393210589896037632229308656}, + {0.680319978360607202638732360356, 0.732915225004517778550905404700}, + {0.679757639371212030177105134499, 0.733436808263995709822324897686}, + {0.679194900497911202563727783854, 0.733957960061495939818598799320}, + {0.678631762071749466969095010427, 0.734478680090438373895267432090}, + {0.678068224424006604778014661861, 0.734998968044496603368997966754}, + {0.677504287886197431589607731439, 0.735518823617598904718306584982}, + {0.676939952790071242105796045507, 0.736038246503927351405138779228}, + {0.676375219467611699108999800956, 0.736557236397919146142498902918}, + {0.675810088251037055506742490252, 0.737075792994265621693728007813}, + {0.675244559472799266153231201315, 0.737593915987913462117830931675}, + {0.674678633465584542960868930095, 0.738111605074064258680266448209}, + {0.674112310562312355699532417930, 0.738628859948174842919854654610}, + {0.673545591096136098130386926641, 0.739145680305957397671079434076}, + {0.672978475400442088805164075893, 0.739662065843379901153298305871}, + {0.672410963808849904133069230738, 0.740178016256666237993044887844}, + {0.671843056655211934291571651556, 0.740693531242295644112516583846}, + {0.671274754273613494248706956569, 0.741208610497004261041809058952}, + {0.670706056998372157629262346745, 0.741723253717784136718194076821}, + {0.670136965164037756714776605804, 0.742237460601884002642236737302}, + {0.669567479105392493465842562728, 0.742751230846809051833190551406}, + {0.668997599157450273388292316668, 0.743264564150321493940509753884}, + {0.668427325655456816555499699462, 0.743777460210440777288454228255}, + {0.667856658934889435563775350602, 0.744289918725443144786879656749}, + {0.667285599331456480420854404656, 0.744801939393862633131959682942}, + {0.666714147181097671612803878816, 0.745313521914490406672371136665}, + {0.666142302819983544992510360316, 0.745824665986375978654621121677}, + {0.665570066584515562801982468955, 0.746335371308826323044627315539}, + {0.664997438811325336516233619477, 0.746845637581406540661532744707}, + {0.664424419837275181954794334160, 0.747355464503940192244613172079}, + {0.663851009999457342125595005200, 0.747864851776509409475579559512}, + {0.663277209635194098247268357227, 0.748373799099454561911670680274}, + {0.662703019082037436682242059760, 0.748882306173375034141770356655}, + {0.662128438677768715869831339660, 0.749390372699129558853314847511}, + {0.661553468760398999393146368675, 0.749897998377835217631570685626}, + {0.660978109668168056778370100801, 0.750405182910869217316474077961}, + {0.660402361739545029628573047376, 0.750911925999867890801908743015}, + {0.659826225313227432422991114436, 0.751418227346727363169520685915}, + {0.659249700728141485583932990266, 0.751924086653603551688718198420}, + {0.658672788323441893432175220369, 0.752429503622912387861276783951}, + {0.658095488438511289075449894881, 0.752934477957330150488246545137}, + {0.657517801412960123386142186064, 0.753439009359793576692254646332}, + {0.656939727586627109090500198363, 0.753943097533499639872900388582}, + {0.656361267299577999523307880736, 0.754446742181906326862872447236}, + {0.655782420892106032717094876716, 0.754949943008732637927948871948}, + {0.655203188704731931402136524412, 0.755452699717958142677787236607}, + {0.654623571078202681761126768833, 0.755955012013824312333554189536}, + {0.654043568353492643652202787052, 0.756456879600833631549505753355}, + {0.653463180871802329363617900526, 0.756958302183750486591407025116}, + {0.652882408974558958725253887678, 0.757459279467600721247322326235}, + {0.652301253003415459907898821257, 0.757959811157672302961429977586}, + {0.651719713300251024534759380913, 0.758459896959515322834022299503}, + {0.651137790207170330525343615591, 0.758959536578942439710715461842}, + {0.650555484066503986184670793591, 0.759458729722028214048634708888}, + {0.649972795220807531002549239929, 0.759957476095110329161741447024}, + {0.649389724012861768720483723882, 0.760455775404789258153925857187}, + {0.648806270785672545287070533959, 0.760953627357928041874401969835}, + {0.648222435882470415791090090352, 0.761451031661653510163034752622}, + {0.647638219646710422416902019904, 0.761947988023355393671920410270}, + {0.647053622422071650355235306051, 0.762444496150687101021503622178}, + {0.646468644552457893937003063911, 0.762940555751565718800577542424}, + {0.645883286381996435387975452613, 0.763436166534172011566283799766}, + {0.645297548255038377895687062846, 0.763931328206951087977927272732}, + {0.644711430516158423564831991825, 0.764426040478612067730068702076}, + {0.644124933510154540350356455747, 0.764920303058128414619432078325}, + {0.643538057582047851035156327271, 0.765414115654738158589509566809}, + {0.642950803077082078118564822944, 0.765907477977944228797468895209}, + {0.642363170340724320972469740809, 0.766400389737514120547245966009}, + {0.641775159718663501529078985186, 0.766892850643480672445662094106}, + {0.641186771556811252459340266796, 0.767384860406141622313214156748}, + {0.640598006201301028994521402637, 0.767876418736060606384796756174}, + {0.640008863998488441993117703532, 0.768367525344066271131282519491}, + {0.639419345294950702829339661548, 0.768858179941253272460244261310}, + {0.638829450437486401348508024967, 0.769348382238982275715954983752}, + {0.638239179773115394844751335768, 0.769838131948879844657085413928}, + {0.637648533649078808061005929630, 0.770327428782838774523611391487}, + {0.637057512412838589099806085869, 0.770816272453018425103721256164}, + {0.636466116412077176356376639887, 0.771304662671844720733815847780}, + {0.635874345994697720563237908209, 0.771792599152010150298508506239}, + {0.635282201508823529678693375899, 0.772280081606474322342137384112}, + {0.634689683302797846842224771535, 0.772767109748463743024160521600}, + {0.634096791725183739352189604688, 0.773253683291472593275273084146}, + {0.633503527124764320710426090955, 0.773739801949261840618987662310}, + {0.632909889850541862443833451835, 0.774225465435860571439263821958}, + {0.632315880251737683082069452212, 0.774710673465565546891298254195}, + {0.631721498677792370202155325387, 0.775195425752941313923827237886}, + {0.631126745478365336339265923016, 0.775679722012820538346034027199}, + {0.630531621003334596942124790075, 0.776163561960304337894456239155}, + {0.629936125602796548328399239836, 0.776646945310762060188380928594}, + {0.629340259627065745640095428826, 0.777129871779831615796751975722}, + {0.628744023426674791821255894320, 0.777612341083419922327379936178}, + {0.628147417352374115573354629305, 0.778094352937702793404639578512}, + {0.627550441755131527266087232420, 0.778575907059124938669469884189}, + {0.626953096986132774048883220530, 0.779057003164400629913188822684}, + {0.626355383396779985538671553513, 0.779537640970513145965981038898}, + {0.625757301338692895065207721927, 0.780017820194715993942224940838}, + {0.625158851163707729448049121856, 0.780497540554531910039770536969}, + {0.624560033223877320018857517425, 0.780976801767753747718359136343}, + {0.623960847871470769554491653253, 0.781455603552444477699623348599}, + {0.623361295458973341254704791936, 0.781933945626937632056296934024}, + {0.622761376339086458742144714051, 0.782411827709836416033795103431}, + {0.622161090864726928906236480543, 0.782889249520015484407053918403}, + {0.621560439389027274970089820272, 0.783366210776619720235203203629}, + {0.620959422265335181378986817435, 0.783842711199065234062288709538}, + {0.620358039847213826867289299116, 0.784318750507038919828062262241}, + {0.619756292488440663213111747609, 0.784794328420499232024099001137}, + {0.619154180543008414439043463062, 0.785269444659675852626889991370}, + {0.618551704365123855566821475804, 0.785744098945070357231656998920}, + {0.617948864309208256706540396408, 0.786218290997455548918537715508}, + {0.617345660729896938967442565627, 0.786692020537876679497912846273}, + {0.616742093982038830368708204333, 0.787165287287650894398893797188}, + {0.616138164420696909928665263578, 0.787638090968367454713927600096}, + {0.615533872401147430508672186988, 0.788110431301888070265704300255}, + {0.614929218278879585746210523212, 0.788582308010347121651761881367}, + {0.614324202409595954144094775984, 0.789053720816151882289091190614}, + {0.613718825149211832936657629034, 0.789524669441982185347228551109}, + {0.613113086853854905022842558537, 0.789995153610791089882070536987}, + {0.612506987879865572033111220662, 0.790465173045804880835873973410}, + {0.611900528583796066151023751445, 0.790934727470523291081860861595}, + {0.611293709322411005224751079368, 0.791403816608719501424218378816}, + {0.610686530452686282544050300203, 0.791872440184440473665006265946}, + {0.610078992331809621951776989590, 0.792340597922007061626459289982}, + {0.609471095317180244776977815491, 0.792808289546014122173289706552}, + {0.608862839766408203701075763092, 0.793275514781330626234989722434}, + {0.608254226037314493780172597326, 0.793742273353100102895041345619}, + {0.607645254487930830400443937833, 0.794208564986740639390916385310}, + {0.607035925476499760300441721483, 0.794674389407944548047169064375}, + {0.606426239361473551348069577216, 0.795139746342679587520763107023}, + {0.605816196501515080719002526166, 0.795604635517188074622652038670}, + {0.605205797255496502629057431477, 0.796069056657987994540803811105}, + {0.604595041982500358557217623456, 0.796533009491872001639478639845}, + {0.603983931041818022933398424357, 0.796996493745908751726858554321}, + {0.603372464792950369272261923470, 0.797459509147442457965837547818}, + {0.602760643595607215061704664549, 0.797922055424093001896324039990}, + {0.602148467809707321762857645808, 0.798384132303756377524450726924}, + {0.601535937795377728676271544828, 0.798845739514604580300272118620}, + {0.600923053912954086008824106102, 0.799306876785086162229276851576}, + {0.600309816522980432829115216009, 0.799767543843925676760875376203}, + {0.599696225986208308889047202683, 0.800227740420124789011424581986}, + {0.599082282663597309735337148595, 0.800687466242961498608110559871}, + {0.598467986916314309553399652941, 0.801146721041991249911973227427}, + {0.597853339105733905256556681707, 0.801605504547046043839486628713}, + {0.597238339593437528307617867540, 0.802063816488235437063281096925}, + {0.596622988741213333696578047238, 0.802521656595946319967538329365}, + {0.596007286911056533007524649292, 0.802979024600843138692596312467}, + {0.595391234465168728284822918795, 0.803435920233868117179554246832}, + {0.594774831765957578966208529891, 0.803892343226241257170272547228}, + {0.594158079176036801882787585782, 0.804348293309460782296582692652}, + {0.593540977058226393303641543753, 0.804803770215302805013379838783}, + {0.592923525775551407690500127501, 0.805258773675822214777042518108}, + {0.592305725691242401786951177201, 0.805713303423352122933920327341}, + {0.591687577168735545640743112017, 0.806167359190504306809543777490}, + {0.591069080571671512380760304950, 0.806620940710169653797834143916}, + {0.590450236263895922306232932897, 0.807074047715517606249591153755}, + {0.589831044609458898797527126590, 0.807526679939997160673215148563}, + {0.589211505972615068316144970595, 0.807978837117336312623194771732}, + {0.588591620717822894270909728220, 0.808430518981542722833921743586}, + {0.587971389209745121107175691577, 0.808881725266903606197388398868}, + {0.587350811813247664083803556423, 0.809332455707985842785490149254}, + {0.586729888893400497451580122288, 0.809782710039636421939235333411}, + {0.586108620815476433207891204802, 0.810232487996982331246442754491}, + {0.585487007944951454163629023242, 0.810681789315430667564044142637}, + {0.584865050647504491898587275500, 0.811130613730669192129596467566}, + {0.584242749289016982672251288022, 0.811578960978665886472072088509}, + {0.583620104235572756401495553291, 0.812026830795669729567975991813}, + {0.582997115853457703593676342280, 0.812474222918210475796740865917}, + {0.582373784509160219435841554514, 0.812921137083098765963029563864}, + {0.581750110569369760504798705369, 0.813367573027426571385944953363}, + {0.581126094400977621923232163681, 0.813813530488567193899029916793}, + {0.580501736371076604292795764195, 0.814259009204175265850267351198}, + {0.579877036846960347560298032477, 0.814704008912187083168987555837}, + {0.579251996196123553062307109940, 0.815148529350820827410473157215}, + {0.578626614786261428413638441270, 0.815592570258576676778261571599}, + {0.578000892985269909551959699456, 0.816036131374236695101842542499}, + {0.577374831161244883581673548179, 0.816479212436865386948170453252}, + {0.576748429682482521840825029358, 0.816921813185809475577059401985}, + {0.576121688917478391722681863030, 0.817363933360698458052695514198}, + {0.575494609234928233831851684954, 0.817805572701444272176729555213}, + {0.574867191003726740738954958942, 0.818246730948241962622091705271}, + {0.574239434592967890047532364406, 0.818687407841569569910689097014}, + {0.573611340371944611327137408807, 0.819127603122188241435708278004}, + {0.572982908710148675091033965145, 0.819567316531142231461615210719}, + {0.572354139977270026662381496863, 0.820006547809759678280272510165}, + {0.571725034543197119241142445389, 0.820445296699652049099427131296}, + {0.571095592778016691859477305115, 0.820883562942714584131920219079}, + {0.570465815052012992225627385778, 0.821321346281126740684896958555}, + {0.569835701735668109790822200011, 0.821758646457351638048294262262}, + {0.569205253199661198593162225734, 0.822195463214137167717865395389}, + {0.568574469814869254413736143761, 0.822631796294514994194457813137}, + {0.567943351952365671486688825098, 0.823067645441801665207037785876}, + {0.567311899983420797610733643523, 0.823503010399598389668085474113}, + {0.566680114279501712104547550553, 0.823937890911791370740502316039}, + {0.566047995212271559672956300346, 0.824372286722551250726098714949}, + {0.565415543153589772451539374742, 0.824806197576334332310921126918}, + {0.564782758475511403872815208160, 0.825239623217882134476042210736}, + {0.564149641550287683777753500181, 0.825672563392221392497560827906}, + {0.563516192750364908192750590388, 0.826105017844664613058114355226}, + {0.562882412448384550351931920886, 0.826536986320809963224576222274}, + {0.562248301017183149674849573785, 0.826968468566541492492660836433}, + {0.561613858829792422788784733712, 0.827399464328029354831528507930}, + {0.560979086259438264328025525174, 0.827829973351729808683785449830}, + {0.560343983679540857956169475074, 0.828259995384385550032391165587}, + {0.559708551463714787388425975223, 0.828689530173025712400658449042}, + {0.559072789985768481280103969766, 0.829118577464965977874555846938}, + {0.558436699619704102204309492663, 0.829547137007808799147312583955}, + {0.557800280739717102562735817628, 0.829975208549443843608628412767}, + {0.557163533720196335607965920644, 0.830402791838047549255463763984}, + {0.556526458935723722376565092418, 0.830829886622083568781249596213}, + {0.555889056761073918622173550830, 0.831256492650303213665097246121}, + {0.555251327571214092770901515905, 0.831682609671745121104891040886}, + {0.554613271741304036943631672330, 0.832108237435735476061893223232}, + {0.553974889646695611844506856869, 0.832533375691888677394558726519}, + {0.553336181662932413694022670825, 0.832958024190106671724720399652}, + {0.552697148165749774229027480033, 0.833382182680579730593706244690}, + {0.552057789531074982747327339894, 0.833805850913786339440036954329}, + {0.551418106135026064862358907703, 0.834229028640493419644030836935}, + {0.550778098353912226592399292713, 0.834651715611756328527803816542}, + {0.550137766564233632315961131098, 0.835073911578919303444479282916}, + {0.549497111142680960682582735899, 0.835495616293615350755885629042}, + {0.548856132466135293590525634499, 0.835916829507766356854858713632}, + {0.548214830911667783119867181085, 0.836337550973583532254451711196}, + {0.547573206856539873577105481672, 0.836757780443567189543330187007}, + {0.546931260678202191272134768951, 0.837177517670507187474981947162}, + {0.546288992754295210652060177381, 0.837596762407483041990019501100}, + {0.545646403462648588167382968095, 0.838015514407863704171575136570}, + {0.545003493181281162272000528901, 0.838433773425308337401418157242}, + {0.544360262288400398311694061704, 0.838851539213765762248442570126}, + {0.543716711162402388524128582503, 0.839268811527475233624784323183}, + {0.543072840181871852038852921396, 0.839685590120966107718913917779}, + {0.542428649725581357721182484966, 0.840101874749058397107148721261}, + {0.541784140172491657239106643829, 0.840517665166862437686745579413}, + {0.541139311901750907907171495026, 0.840932961129779665832018054061}, + {0.540494165292695227797992174601, 0.841347762393501952260521647986}, + {0.539848700724847696541530694958, 0.841762068714012490211473505042}, + {0.539202918577918244302793482348, 0.842175879847585573401147485129}, + {0.538556819231804206893343689444, 0.842589195550786596022874164191}, + {0.537910403066588993503671645158, 0.843002015580472829903158071829}, + {0.537263670462542530792404704698, 0.843414339693792758367862916202}, + {0.536616621800121151864004787058, 0.843826167648186742376026359125}, + {0.535969257459966708090348674887, 0.844237499201387020519860016066}, + {0.535321577822907013199937864556, 0.844648334111417820047051918664}, + {0.534673583269955510210991178610, 0.845058672136595467883068977244}, + {0.534025274182310383253025065642, 0.845468513035528834720366830879}, + {0.533376650941355556767575762933, 0.845877856567118890929179997329}, + {0.532727713928658808129057433689, 0.846286702490559705758244035678}, + {0.532078463525973544001601567288, 0.846695050565337448134073383699}, + {0.531428900115236912959915116517, 0.847102900551231496883985983004}, + {0.530779024078570249578490347631, 0.847510252208314329713800816535}, + {0.530128835798278852386999915325, 0.847917105296951412185535446042}, + {0.529478335656852094892599325249, 0.848323459577801530784313399636}, + {0.528827524036961982289994921302, 0.848729314811817014962969096814}, + {0.528176401321464372706770973309, 0.849134670760243626119745385949}, + {0.527524967893398200047272439406, 0.849539527184620890665200931835}, + {0.526873224135984696836487728433, 0.849943883846782211044512678200}, + {0.526221170432628171376165937545, 0.850347740508854976759778310225}, + {0.525568807166914675477187302022, 0.850751096933260786414621179574}, + {0.524916134722612892637982895394, 0.851153952882715336691887841880}, + {0.524263153483673471910719854350, 0.851556308120228866442857906804}, + {0.523609863834228028700579216093, 0.851958162409106378731848963071}, + {0.522956266158590143966478080984, 0.852359515512947085724704265886}, + {0.522302360841254698087254837446, 0.852760367195645296867212437064}, + {0.521648148266897093705551924359, 0.853160717221390418885107465030}, + {0.520993628820373810839328143629, 0.853560565354666844761766242300}, + {0.520338802886721962792648810137, 0.853959911360254064760511027998}, + {0.519683670851158518999568514118, 0.854358755003227443580726685468}, + {0.519028233099080971157945896266, 0.854757096048957110134836057114}, + {0.518372490016066223006419022568, 0.855154934263109622882836902136}, + {0.517716441987871145435917696886, 0.855552269411646970631579733890}, + {0.517060089400432132400453610899, 0.855949101260826794579372744920}, + {0.516403432639863990694095718936, 0.856345429577203609561308894627}, + {0.515746472092461383240902250691, 0.856741254127627471781636359083}, + {0.515089208144697274782686235994, 0.857136574679244866992178231158}, + {0.514431641183222931879015504819, 0.857531390999499043559239908063}, + {0.513773771594868033929515149794, 0.857925702856129790419004166324}, + {0.513115599766640562151565063687, 0.858319510017173437077531161776}, + {0.512457126085725800379577776766, 0.858712812250963519744573204662}, + {0.511798350939487001198813231895, 0.859105609326130337244364909566}, + {0.511139274715464386744656621886, 0.859497901011601617149437970511}, + {0.510479897801375703814130702085, 0.859889687076602293736016235925}, + {0.509820220585115557732081015274, 0.860280967290654507984015708644}, + {0.509160243454754746217361116578, 0.860671741423578384733161783515}, + {0.508499966798540814494344886043, 0.861062009245491477571476934827}, + {0.507839391004897944270624066121, 0.861451770526809212924490566365}, + {0.507178516462425288402471323934, 0.861841025038245334144448861480}, + {0.506517343559898525207074726495, 0.862229772550811235376500007987}, + {0.505855872686268859261815578066, 0.862618012835816738714811435784}, + {0.505194104230662244248151182546, 0.863005745664870205224872279359}, + {0.504532038582380382152337006119, 0.863392970809878312898888452764}, + {0.503869676130898946908587276994, 0.863779688043046611767294962192}, + {0.503207017265869027689006998116, 0.864165897136879301854150980944}, + {0.502544062377115796635962396977, 0.864551597864179233177139849431}, + {0.501880811854638397839778463094, 0.864936789998049015970593700331}, + {0.501217266088609947338738948019, 0.865321473311889799440166370914}, + {0.500553425469377644141388827848, 0.865705647579402270963555565686}, + {0.499889290387461382447753521774, 0.866089312574586767112805318902}, + {0.499224861233555028405817211024, 0.866472468071743051609701069538}, + {0.498560138398525198866195751179, 0.866855113845470315325769661285}, + {0.497895122273410928315229284635, 0.867237249670668397527606430231}, + {0.497229813249424335008797015689, 0.867618875322536231564640729630}, + {0.496564211717949344215838891614, 0.867999990576573399181370405131}, + {0.495898318070542243329867915236, 0.868380595208579797450454407226}, + {0.495232132698931348802062757386, 0.868760688994655194683502941189}, + {0.494565655995016006940545594261, 0.869140271711200562698707017262}, + {0.493898888350867426577650576291, 0.869519343134916966597813825501}, + {0.493231830158728068447260284302, 0.869897903042806341922243973386}, + {0.492564481811010645984083566873, 0.870275951212171827719998873363}, + {0.491896843700299235546680165498, 0.870653487420617544501055817818}, + {0.491228916219348332727889783200, 0.871030511446048261170460591529}, + {0.490560699761082075198714846920, 0.871407023066670949340561946883}, + {0.489892194718595297420193901416, 0.871783022060993006974172203627}, + {0.489223401485152031842318365307, 0.872158508207824478830616499181}, + {0.488554320454186230548998537415, 0.872533481286276058064288463356}, + {0.487884952019301210146551284197, 0.872907941075760973603792081121}, + {0.487215296574268819096431570870, 0.873281887355994212995824454993}, + {0.486545354513030270382500930282, 0.873655319906992633427478267549}, + {0.485875126229695419866061456560, 0.874028238509075627860056556528}, + {0.485204612118541878107436104983, 0.874400642942864791962165327277}, + {0.484533812574016120588993317142, 0.874772532989284146154318477784}, + {0.483862727990732321980971164521, 0.875143908429560246631240261195}, + {0.483191358763471912052267498439, 0.875514769045222740473377598391}, + {0.482519705287184519360010881428, 0.875885114618103699513085302897}, + {0.481847767956986083870418724473, 0.876254944930338397490743318485}, + {0.481175547168160355759880530968, 0.876624259764365310054756719182}, + {0.480503043316157674169630809047, 0.876993058902925781694648321718}, + {0.479830256796594245560783065230, 0.877361342129065135964083310682}, + {0.479157188005253309448505660839, 0.877729109226131565257844613370}, + {0.478483837338084083690148418100, 0.878096359977777130012555062422}, + {0.477810205191201042840276613788, 0.878463094167957869728979858337}, + {0.477136291960884750817939448098, 0.878829311580933358882816719415}, + {0.476462098043581305795157732064, 0.879195012001267373058510656847}, + {0.475787623835901118951596799889, 0.879560195213827888949253974715}, + {0.475112869734620468786800984162, 0.879924861003786862312381344964}, + {0.474437836136679336185295596806, 0.880289009156620894103184582491}, + {0.473762523439182847706518941777, 0.880652639458111008430307720118}, + {0.473086932039400220872948921169, 0.881015751694342763578049471107}, + {0.472411062334764098036288260118, 0.881378345651706807117875541735}, + {0.471734914722871434555884206929, 0.881740421116898320796906318719}, + {0.471058489601482610620308832949, 0.882101977876917575649429181794}, + {0.470381787368520709602393026216, 0.882463015719070043019200966228}, + {0.469704808422072461748797422842, 0.882823534430966727626355350367}, + {0.469027553160387244979290244373, 0.883183533800523279388983155513}, + {0.468350021981876529775234985209, 0.883543013615961880802274208691}, + {0.467672215285114711846858881472, 0.883901973665809470581677942391}, + {0.466994133468838112932530748367, 0.884260413738899075930532944767}, + {0.466315776931944481198399898858, 0.884618333624369923562369422143}, + {0.465637146073493768394513381281, 0.884975733111666662544791961409}, + {0.464958241292706742076035197897, 0.885332611990540585544806617690}, + {0.464279062988965762759363542500, 0.885688970051048962695006139256}, + {0.463599611561814117788316025326, 0.886044807083555485682779817580}, + {0.462919887410955133155709972925, 0.886400122878730489794918412372}, + {0.462239890936253283726387053321, 0.886754917227550953917614151578}, + {0.461559622537733194036491113366, 0.887109189921300056447250881320}, + {0.460879082615578694603897247362, 0.887462940751568840624941003625}, + {0.460198271570134265218143809761, 0.887816169510254549201988538698}, + {0.459517189801903591650500402466, 0.888168875989561623640611287556}, + {0.458835837711549121564758024761, 0.888521059982002259225453144609}, + {0.458154215699893230251404929732, 0.888872721280395516885164397536}, + {0.457472324167916111203879836467, 0.889223859677868211370821427408}, + {0.456790163516757219408503942759, 0.889574474967854578189019321144}, + {0.456107734147714216632607531210, 0.889924566944096717691081721568}, + {0.455425036462242416313017656648, 0.890274135400644484050758364901}, + {0.454742070861955449689872921226, 0.890623180131855929353434930817}, + {0.454058837748624544161657468067, 0.890971700932396748484620729869}, + {0.453375337524177746129083743654, 0.891319697597241389352973328641}, + {0.452691570590700864684663429216, 0.891667169921672386756483774661}, + {0.452007537350436527923136509344, 0.892014117701280362382476596395}, + {0.451323238205783516807656496894, 0.892360540731965357075239353435}, + {0.450638673559297764370512595633, 0.892706438809935276523788161285}, + {0.449953843813690579356290299984, 0.893051811731707445574102166574}, + {0.449268749371829922978349713958, 0.893396659294107609028401384421}, + {0.448583390636739298695800925998, 0.893740981294271041868171323586}, + {0.447897768011597308124294158915, 0.894084777529641994142650673894}, + {0.447211881899738261658683313726, 0.894428047797973801991133768752}, + {0.446525732704651401316908732042, 0.894770791897329553776785360242}, + {0.445839320829980345628484883491, 0.895113009626081757019733231573}, + {0.445152646679523589234861447039, 0.895454700782912449419370659598}, + {0.444465710657234114311364692185, 0.895795865166813420898961339844}, + {0.443778513167218280344172853802, 0.896136502577086768717151699093}, + {0.443091054613736989864491988556, 0.896476612813344009289551195252}, + {0.442403335401204134136321499682, 0.896816195675507188411756942514}, + {0.441715355934187314801420143340, 0.897155250963808548192446323810}, + {0.441027116617407344278944947291, 0.897493778478790193986469603260}, + {0.440338617855737302075880279517, 0.897831778021305648707084401394}, + {0.439649860054203422965457548344, 0.898169249392518076469116294902}, + {0.438960843617984430853340427348, 0.898506192393901836901193291851}, + {0.438271568952410484065751461458, 0.898842606827242263101140906656}, + {0.437582036462964341083647923369, 0.899178492494635328569074772531}, + {0.436892246555280472364302113419, 0.899513849198487869252005566523}, + {0.436202199635143950118276734429, 0.899848676741518582744561172149}, + {0.435511896108492169155113060697, 0.900182974926756696021357129212}, + {0.434821336381412348881525531397, 0.900516743557543519749231109017}, + {0.434130520860143309658241150828, 0.900849982437531449086520751734}, + {0.433439449951074196043521169486, 0.901182691370684407772273516457}, + {0.432748124060743755148195077709, 0.901514870161278625282363918814}, + {0.432056543595841446858685230836, 0.901846518613901859673376293358}, + {0.431364708963206444636284686567, 0.902177636533453508604907256085}, + {0.430672620569826858361039967349, 0.902508223725145830584892792103}, + {0.429980278822840566999019529248, 0.902838279994502834746583630476}, + {0.429287684129534719001952680628, 0.903167805147360613915452631772}, + {0.428594836897344400039600031960, 0.903496798989868454832219413220}, + {0.427901737533854242823139202301, 0.903825261328487394862918336003}, + {0.427208386446796373192569262756, 0.904153191969991665288830517966}, + {0.426514784044051520339735361631, 0.904480590721468247217273983551}, + {0.425820930733648350674513949343, 0.904807457390316538514696276252}, + {0.425126826923762413112939384519, 0.905133791784249575052001546283}, + {0.424432473022717415833682252924, 0.905459593711293253548433312972}, + {0.423737869438983949521571048535, 0.905784862979786442593876927276}, + {0.423043016581179098789533554736, 0.906109599398381981849581734423}, + {0.422347914858066997290109156893, 0.906433802776045460802833986236}, + {0.421652564678558383626238992292, 0.906757472922056551034586391324}, + {0.420956966451709435617090093729, 0.907080609646008451107945802505}, + {0.420261120586723047054533708433, 0.907403212757807997590475679317}, + {0.419565027492946940324003435308, 0.907725282067676442210313325631}, + {0.418868687579875109694427237628, 0.908046817386148341633145264495}, + {0.418172101257146433539446661598, 0.908367818524072778707534325804}, + {0.417475268934544341270509448805, 0.908688285292613362464919646300}, + {0.416778191021997590492986773825, 0.909008217503247450963499431964}, + {0.416080867929579323316602312843, 0.909327614967767261511255583173}, + {0.415383300067506289199315006044, 0.909646477498279537599046307150}, + {0.414685487846140010681494914024, 0.909964804907205659922908580484}, + {0.413987431675985506629444898863, 0.910282597007281757406360611640}, + {0.413289131967690959168493236575, 0.910599853611558929245006765996}, + {0.412590589132048379816808392206, 0.910916574533403244906537565839}, + {0.411891803579992221706618238386, 0.911232759586496188219939540431}, + {0.411192775722600156740327292937, 0.911548408584833991241680450912}, + {0.410493505971092520479004406297, 0.911863521342728522434128990426}, + {0.409793994736831201919358136365, 0.912178097674807064620949859091}, + {0.409094242431320920250215067426, 0.912492137396012648054011151544}, + {0.408394249466208114629495185000, 0.912805640321603495301872044365}, + {0.407694016253280167028094638226, 0.913118606267154131472807421233}, + {0.406993543204466456941759133770, 0.913431035048554718080993097828}, + {0.406292830731837473212664235689, 0.913742926482011386113413209387}, + {0.405591879247603870339844434056, 0.914054280384046458074465135724}, + {0.404890689164117745235671463888, 0.914365096571498447985959501239}, + {0.404189260893870749846712442377, 0.914675374861522394454027562460}, + {0.403487594849495312399056956565, 0.914985115071589305557608895469}, + {0.402785691443763638197594900703, 0.915294317019487047026871096023}, + {0.402083551089587043492201701156, 0.915602980523320231220907317038}, + {0.401381174200016788145006785271, 0.915911105401509884060828881047}, + {0.400678561188243353985427575026, 0.916218691472794111163580055290}, + {0.399975712467595390098296093129, 0.916525738556228097841938051715}, + {0.399272628451540934069186050692, 0.916832246471183887059908101946}, + {0.398569309553686412783690684591, 0.917138215037350712499630844832}, + {0.397865756187775754249003057339, 0.917443644074735220605987251474}, + {0.397161968767691719861545607273, 0.917748533403661248541993700201}, + {0.396457947707453961516677054533, 0.918052882844770379300314289139}, + {0.395753693421220076320565794958, 0.918356692219021719658655911189}, + {0.395049206323284884945223893737, 0.918659961347691900179768254020}, + {0.394344486828079654472389847797, 0.918962690052375630322956112650}, + {0.393639535350172875549645823412, 0.919264878154985254354869539384}, + {0.392934352304269596256602881112, 0.919566525477751528505621081422}, + {0.392228938105210367393027581784, 0.919867631843222954834971005766}, + {0.391523293167972352701866611824, 0.920168197074266447366142074316}, + {0.390817417907668607224280776791, 0.920468220994067110041214618832}, + {0.390111312739546911565469144989, 0.920767703426128791832638853521}, + {0.389404978078991104162298597657, 0.921066644194273531631722562452}, + {0.388698414341519249415313197460, 0.921365043122642335404748337169}, + {0.387991621942784914445212507417, 0.921662900035694732103763726627}, + {0.387284601298575892336373271974, 0.921960214758209106733488624741}, + {0.386577352824813980092244491971, 0.922256987115283033418222657929}, + {0.385869876937555311702254812189, 0.922553216932332831312635335053}, + {0.385162174052989969563753902548, 0.922848904035094119713278359995}, + {0.384454244587440874258987832945, 0.923144048249621818058585631661}, + {0.383746088957365005800426160931, 0.923438649402290367973478169006}, + {0.383037707579352126874283612779, 0.923732707319793178157851798460}, + {0.382329100870124505284763927193, 0.924026221829143845631904241600}, + {0.381620269246537524576723399150, 0.924319192757675156535412952508}, + {0.380911213125578129723436404674, 0.924611619933039974306154817896}, + {0.380201932924366048371922488514, 0.924903503183210906612998769560}, + {0.379492429060152736131072970238, 0.925194842336480416378208246897}, + {0.378782701950320599415533706633, 0.925485637221461487911255971994}, + {0.378072752012383994646427254338, 0.925775887667086738730404249509}, + {0.377362579663988451095235632238, 0.926065593502609307741124666791}, + {0.376652185322909616171926927564, 0.926354754557602855236098093883}, + {0.375941569407054421159131152308, 0.926643370661961229828307295975}, + {0.375230732334460026500266849325, 0.926931441645899134584851708496}, + {0.374519674523293211176877548496, 0.927218967339951793960040049569}, + {0.373808396391851371909353929368, 0.927505947574975175839995245042}, + {0.373096898358560691288943189647, 0.927792382182146324609561816033}, + {0.372385180841977359023076132871, 0.928078270992963139107700953900}, + {0.371673244260786628245796237024, 0.928363613839244372627490520244}, + {0.370961089033802038361642416930, 0.928648410553130521094544747029}, + {0.370248715579966358735219955634, 0.928932660967082823866292073944}, + {0.369536124318350756023932035532, 0.929216364913883929865789923497}, + {0.368823315668153961510711269511, 0.929499522226638563715539476107}, + {0.368110290048703048260136938552, 0.929782132738772193469856119918}, + {0.367397047879452820495771447895, 0.930064196284032362882499000989}, + {0.366683589579984925421740626916, 0.930345712696488469362066098256}, + {0.365969915570008907934607123025, 0.930626681810531652949691761023}, + {0.365256026269360378755379770155, 0.930907103460875018363651633990}, + {0.364541922098002180163689445180, 0.931186977482553746021665119770}, + {0.363827603476023608841671830305, 0.931466303710925092040895378886}, + {0.363113070823639527695547712938, 0.931745081981668721304856717325}, + {0.362398324561191309545193917074, 0.932023312130786485418809661496}, + {0.361683365109145948945723603174, 0.932300993994602644754365883273}, + {0.360968192888095285031369030548, 0.932578127409764423561000512564}, + {0.360252808318756834182750026230, 0.932854712213241232809934899706}, + {0.359537211821973179404210441135, 0.933130748242325114283346465527}, + {0.358821403818710860100793524907, 0.933406235334631517730485938955}, + {0.358105384730061759857022707365, 0.933681173328098301666955194378}, + {0.357389154977240997013154810702, 0.933955562060986732575429414283}, + {0.356672714981588256932809599675, 0.934229401371880818771842314163}, + {0.355956065164567014846852543997, 0.934502691099687865516898455098}, + {0.355239205947763370119218961918, 0.934775431083638697060678168782}, + {0.354522137752887434025694801676, 0.935047621163287434598032632493}, + {0.353804861001772164019740785079, 0.935319261178511496268583869096}, + {0.353087376116372531065223938640, 0.935590350969512374312841984647}, + {0.352369683518766629859442218731, 0.935860890376814635871483005758}, + {0.351651783631154679632402348943, 0.936130879241266922186071042233}, + {0.350933676875858358013005044995, 0.936400317404042059621360749588}, + {0.350215363675321744718615946113, 0.936669204706636060464575166407}, + {0.349496844452109600709377446037, 0.936937540990869899282245114591}, + {0.348778119628908422900082086926, 0.937205326098887958607974724146}, + {0.348059189628525778026357784256, 0.937472559873159139165466058330}, + {0.347340054873889192421643201669, 0.937739242156476970890821576177}, + {0.346620715788047317751363607385, 0.938005372791958835776426894881}, + {0.345901172794169098345662405336, 0.938270951623047078093975414959}, + {0.345181426315542605465225278749, 0.938535978493508560305258470180}, + {0.344461476775576480591212202853, 0.938800453247434774084467790090}, + {0.343741324597798603157627894689, 0.939064375729241951340497962519}, + {0.343020970205855535439809500531, 0.939327745783671397283853821136}, + {0.342300414023513688288602452303, 0.939590563255789157359743057896}, + {0.341579656474657211706613679780, 0.939852827990986683381890998135}, + {0.340858697983289438138143623291, 0.940114539834980278421028287994}, + {0.340137538973531883268464071080, 0.940375698633811540894100744481}, + {0.339416179869623413356549690434, 0.940636304233847586608874280500}, + {0.338694621095921188924648959073, 0.940896356481780826719329979824}, + {0.337972863076899832091015696278, 0.941155855224629189770269022119}, + {0.337250906237150649413791825282, 0.941414800309736232719615145470}, + {0.336528751001382353535973379621, 0.941673191584771362983019571402}, + {0.335806397794420563585049421818, 0.941931028897729505366953617340}, + {0.335083847041206583927674955703, 0.942188312096931768202523471700}, + {0.334361099166798902970754170383, 0.942445041031024888233957881312}, + {0.333638154596370917204239958664, 0.942701215548981896752422926511}, + {0.332915013755212652046822086049, 0.942956835500102119596022021142}, + {0.332191677068729318555995178031, 0.943211900734010622038283599977}, + {0.331468144962440924850000101287, 0.943466411100659319011185743875}, + {0.330744417861982886730487507521, 0.943720366450326197949038942170}, + {0.330020496193105528082156752134, 0.943973766633615984922300867765}, + {0.329296380381672804116277575304, 0.944226611501459811570668989589}, + {0.328572070853663689149470883422, 0.944478900905115548169987960136}, + {0.327847568035170955358381661426, 0.944730634696167803632249615475}, + {0.327122872352400506645864197708, 0.944981812726528147550197900273}, + {0.326397984231672655397460403037, 0.945232434848434888152723942767}, + {0.325672904099419902035350560254, 0.945482500914453738438680829859}, + {0.324947632382188433819436568228, 0.945732010777477150043068832019}, + {0.324222169506637125646619779218, 0.945980964290724757326245253353}, + {0.323496515899536762894683761260, 0.946229361307743821463134281657}, + {0.322770671987770707556109073266, 0.946477201682408675331714675849}, + {0.322044638198334620682317108731, 0.946724485268921167602229616023}, + {0.321318414958334908071435620514, 0.946971211921810884781791628484}, + {0.320592002694990330091684427316, 0.947217381495934818147475198202}, + {0.319865401835630613902594632236, 0.947462993846477696813224156358}, + {0.319138612807695898343496310190, 0.947708048828952098752154142858}, + {0.318411636038737955178845595583, 0.947952546299198561818855068850}, + {0.317684471956418024163326663256, 0.948196486113385583749391116726}, + {0.316957120988508145309481278673, 0.948439868128009622161300740117}, + {0.316229583562890492753894022826, 0.948682692199895094553596663900}, + {0.315501860107556042489562742048, 0.948924958186195155462883121800}, + {0.314773951050606071166981791976, 0.949166665944390697262633693754}, + {0.314045856820250823826512487358, 0.949407815332291460386215931067}, + {0.313317577844809069809173251997, 0.949648406208035478215379043831}, + {0.312589114552708657868151931325, 0.949888438430089299124858825962}, + {0.311860467372486127590747173599, 0.950127911857248097504680117709}, + {0.311131636732785266108436417198, 0.950366826348635784782459268172}, + {0.310402623062358884453715290874, 0.950605181763705231468009060336}, + {0.309673426790066486091745900922, 0.950842977962238156131036248553}, + {0.308944048344875710210288843882, 0.951080214804345014378839096025}, + {0.308214488155861221496678581389, 0.951316892150465553967819687387}, + {0.307484746652204155026311127585, 0.951553009861368592758879003668}, + {0.306754824263192782396458824223, 0.951788567798152129739719384816}, + {0.306024721418221901103606796823, 0.952023565822243567069449454721}, + {0.305294438546791724320428329520, 0.952258003795399599056281658704}, + {0.304563976078509046629960721475, 0.952491881579706323179834726034}, + {0.303833334443086466869488049269, 0.952725199037579573158041057468}, + {0.303102514070341055862911616714, 0.952957956031764696902541800227}, + {0.302371515390196132777589355101, 0.953190152425336556518686847994}, + {0.301640338832678878144832879116, 0.953421788081700305461652078520}, + {0.300908984827921888172141962059, 0.953652862864590500358019653504}, + {0.300177453806162120031331141945, 0.953883376638071767139592793683}, + {0.299445746197739948168958790120, 0.954113329266538801043395778834}, + {0.298713862433100385551654198935, 0.954342720614716477633976410289}, + {0.297981802942791917931941725328, 0.954571550547659630758801085904}, + {0.297249568157465893225577246994, 0.954799818930753718682069575152}, + {0.296517158507877409689967862505, 0.955027525629714157950900244032}, + {0.295784574424884372234600959928, 0.955254670510586989529144830158}, + {0.295051816339446715264926979216, 0.955481253439748767775085980247}, + {0.294318884682627568416535268625, 0.955707274283906560441437250120}, + {0.293585779885591313664860990684, 0.955932732910098170719948029728}, + {0.292852502379604806570512209873, 0.956157629185692137241403543158}, + {0.292119052596036543612001423753, 0.956381962978387623053322386113}, + {0.291385430966355718496174631582, 0.956605734156215081753771301010}, + {0.290651637922133221358933496958, 0.956828942587535369312945476850}, + {0.289917673895040861609118110209, 0.957051588141040965318495636893}, + {0.289183539316850313216633594493, 0.957273670685755195819410801050}, + {0.288449234619434169424323499697, 0.957495190091032566392925673426}, + {0.287714760234765276614155027346, 0.957716146226558873166823104839}, + {0.286980116594915568573043174183, 0.957936538962351424864039017848}, + {0.286245304132057121204724126073, 0.958156368168758820758057481726}, + {0.285510323278461375373638020392, 0.958375633716461172717515637487}, + {0.284775174466498304237660477156, 0.958594335476470216228506160405}, + {0.284039858128637356937673530410, 0.958812473320129199372274797497}, + {0.283304374697445793263028690490, 0.959030047119113548959035142616}, + {0.282568724605589738363420337919, 0.959247056745430093371851398842}, + {0.281832908285833461103919717061, 0.959463502071417506655848228547}, + {0.281096926171038319353101542220, 0.959679382969746752607420603454}, + {0.280360778694163814694917391535, 0.959894699313420529662721492059}, + {0.279624466288266704250276006860, 0.960109450975773937031476634729}, + {0.278887989386500279032077287411, 0.960323637830473919585472231120}, + {0.278151348422115085590178296115, 0.960537259751520045014672177786}, + {0.277414543828458204366427253262, 0.960750316613243948715705755603}, + {0.276677576038972417027395067635, 0.960962808290309777881077479833}, + {0.275940445487197316687399961666, 0.961174734657714080476864637603}, + {0.275203152606767365018214377415, 0.961386095590786249331927137973}, + {0.274465697831413224516694526756, 0.961596890965187856004092736839}, + {0.273728081594960648281755766220, 0.961807120656913538958576737059}, + {0.272990304331329980414011515677, 0.962016784542290559478772138391}, + {0.272252366474536655616134339652, 0.962225882497979023710854562523}, + {0.271514268458690810614797328526, 0.962434414400971993686084715591}, + {0.270776010717996007404195779600, 0.962642380128595709365413313208}, + {0.270037593686750510002525516029, 0.962849779558509033527968767885}, + {0.269299017799346229740109492923, 0.963056612568704339949476889160}, + {0.268560283490267892592129328477, 0.963262879037507069313051033532}, + {0.267821391194094315935103622905, 0.963468578843575951253797029494}, + {0.267082341345496354634292401897, 0.963673711865903226403418102564}, + {0.266343134379238177800175435550, 0.963878277983814202301005025220}, + {0.265603770730176436121183769501, 0.964082277076968141571455817029}, + {0.264864250833259318174128793544, 0.964285709025357373747056044522}, + {0.264124575123527494113773173012, 0.964488573709308405490503446345}, + {0.263384744036113394027864842428, 0.964690871009480921394185770623}, + {0.262644758006240097714112380345, 0.964892600806868894203205400117}, + {0.261904617469222555925512097019, 0.965093762982799585614657189581}, + {0.261164322860466591169625871771, 0.965294357418934656500653090916}, + {0.260423874615468009530161452858, 0.965494383997269500774507378082}, + {0.259683273169813932934602007663, 0.965693842600133689479946497158}, + {0.258942518959180578708156872381, 0.965892733110190859768806603824}, + {0.258201612419334869397147258496, 0.966091055410438825923336025880}, + {0.257460553986133211523679165111, 0.966288809384209579356195263244}, + {0.256719344095520718429526141335, 0.966485994915169843721969300532}, + {0.255977983183532376010305142700, 0.966682611887320186738747906929}, + {0.255236471686291821470149443485, 0.966878660184995908366545336321}, + {0.254494810040010788210196324144, 0.967074139692867040807300327288}, + {0.253752998680989938495855540168, 0.967269050295937793393363790528}, + {0.253011038045617975278389621963, 0.967463391879547440765918508987}, + {0.252268928570370809527645405979, 0.967657164329369878785769287788}, + {0.251526670691812781477381122386, 0.967850367531413624533342954237}, + {0.250784264846594551201519607275, 0.968043001372022260397898207884}, + {0.250041711471454652926382777878, 0.968235065737874323055223158008}, + {0.249299011003218301540940160521, 0.968426560515983192445332861098}, + {0.248556163878796615440691653021, 0.968617485593697535861679170921}, + {0.247813170535187615728389687320, 0.968807840858700974884243350971}, + {0.247070031409475365791195144993, 0.968997626199012307424140999501}, + {0.246326746938829055366682041495, 0.969186841502985951812831899588}, + {0.245583317560503999743559688795, 0.969375486659311280668305244035}, + {0.244839743711840751583252995260, 0.969563561557013176006591947953}, + {0.244096025830264212741482765523, 0.969751066085452140264067111275}, + {0.243352164353284883269168403785, 0.969938000134323963230542631209}, + {0.242608159718496890766559204167, 0.970124363593660277160779514816}, + {0.241864012363579211628561438374, 0.970310156353828112685278028948}, + {0.241119722726294727355167424321, 0.970495378305530453921790012828}, + {0.240375291244489502906489519773, 0.970680029339806127453016415529}, + {0.239630718356093563858877359962, 0.970864109348029469259699908434}, + {0.238886004499120174759951851229, 0.971047618221911101876742122840}, + {0.238141150111664867683458624015, 0.971230555853497379281691337383}, + {0.237396155631906552452292658018, 0.971412922135170942006254790613}, + {0.236651021498106461926624888292, 0.971594716959650162024786368420}, + {0.235905748148607374847784967642, 0.971775940219990141955008766672}, + {0.235160336021834864839163969918, 0.971956591809581604834988866060}, + {0.234414785556295246493618833483, 0.972136671622152115368464819767}, + {0.233669097190576824374375064508, 0.972316179551765302768728815863}, + {0.232923271363349115858909499366, 0.972495115492821193825534464850}, + {0.232177308513361768671501295103, 0.972673479340056434949701724690}, + {0.231431209079445726617407785852, 0.972851270988544181150814438297}, + {0.230684973500512313648869167082, 0.973028490333694096037220333528}, + {0.229938602215552262419961948581, 0.973205137271252795905240873253}, + {0.229192095663636741242896732729, 0.973381211697303294627658942773}, + {0.228445454283916549176325361259, 0.973556713508265558765231162397}, + {0.227698678515621172335769983874, 0.973731642600896396544385424932}, + {0.226951768798059977383374530291, 0.973905998872289457857220895676}, + {0.226204725570620268637611616214, 0.974079782219875678350717862486}, + {0.225457549272768537074185246638, 0.974252992541422502270620498166}, + {0.224710240344049572147611115724, 0.974425629735034992684461485624}, + {0.223962799224085518101645675415, 0.974597693699155054325444780261}, + {0.223215226352576956436735144962, 0.974769184332561766659352997522}, + {0.222467522169301989976020195172, 0.974940101534371716951454800437}, + {0.221719687114115243664613785768, 0.975110445204038889244202437112}, + {0.220971721626949058059352637429, 0.975280215241354220268021890661}, + {0.220223626147812462372499453522, 0.975449411546446376597430116817}, + {0.219475401116790341804474451237, 0.975618034019781754651035043935}, + {0.218727046974044603278031217997, 0.975786082562163925580023260409}, + {0.217978564159812288059114848693, 0.975953557074734301401974789769}, + {0.217229953114406793002189033359, 0.976120457458971912956258165650}, + {0.216481214278216899105089510158, 0.976286783616693631948635356821}, + {0.215732348091705938841755596513, 0.976452535450054059928959304671}, + {0.214983354995412823118527967381, 0.976617712861545639313476385723}, + {0.214234235429951097584577723865, 0.976782315753998653384826411639}, + {0.213484989836008082209062308721, 0.976946344030581559358950016758}, + {0.212735618654345870481847668998, 0.977109797594800877362786195590}, + {0.211986122325800413479512940285, 0.977272676350500857367364915262}, + {0.211236501291280714953657593469, 0.977434980201864256343924353132}, + {0.210486755991769886042774828638, 0.977596709053411783152398584207}, + {0.209736886868323368915412174829, 0.977757862810002764675232356240}, + {0.208986894362070074748771730810, 0.977918441376834368661263852118}, + {0.208236778914211467794714849333, 0.978078444659442380881841927476}, + {0.207486540966020704956918052630, 0.978237872563701094108523648174}, + {0.206736180958843662747170810690, 0.978396724995823086068469365273}, + {0.205985699334098049106955841125, 0.978555001862359552511350102577}, + {0.205235096533272376451151330912, 0.978712703070200418231650019152}, + {0.204484372997927182913358024052, 0.978869828526574115024061484291}, + {0.203733529169694005389601443312, 0.979026378139047581683485077519}, + {0.202982565490274463604336574463, 0.979182351815526930138844363682}, + {0.202231482401441620133653032099, 0.979337749464256779319271117856}, + {0.201480280345037815470377040583, 0.979492570993820699243315175408}, + {0.200728959762976139069579062379, 0.979646816313141211018944431999}, + {0.199977521097239291369973557266, 0.979800485331479675821242381062}, + {0.199225964789878889904528591615, 0.979953577958436738981617963873}, + {0.198474291283016357478885538512, 0.980106094103951774876293256966}, + {0.197722501018842033992939377640, 0.980258033678303553060118247231}, + {0.196970594439614371529145842032, 0.980409396592109905199663444364}, + {0.196218571987660850286516733831, 0.980560182756327947117824805900}, + {0.195466434105377090402200224162, 0.980710392082253967771521274699}, + {0.194714181235225991528636768635, 0.980860024481523873340904629003}, + {0.193961813819739009590037426278, 0.981009079866112632117847169866}, + {0.193209332301514075114212687367, 0.981157558148334829617454033723}, + {0.192456737123216842233475176727, 0.981305459240844668578063192399}, + {0.191704028727579939284098031749, 0.981452783056635524872035603039}, + {0.190951207557401858583290277238, 0.981599529509040724661872445722}, + {0.190198274055548122163372681825, 0.981745698511732989288702810882}, + {0.189445228664950338082206826584, 0.981891289978724990383796011884}, + {0.188692071828605256733624173648, 0.982036303824369016801654197479}, + {0.187938803989575853314875075739, 0.982180739963357196664617276838}, + {0.187185425590990439648209076040, 0.982324598310721164295955531998}, + {0.186431937076041637224577129928, 0.982467878781833170442894243024}, + {0.185678338887987792737988002045, 0.982610581292404750008984137821}, + {0.184924631470150868661761478506, 0.982752705758487832277126017289}, + {0.184170815265917720005006685824, 0.982894252096474074775755980227}, + {0.183416890718739233889778006414, 0.983035220223095640434962660947}, + {0.182662858272129358105928531586, 0.983175610055424420430369991664}, + {0.181908718369666155822983455437, 0.983315421510872811339254440099}, + {0.181154471454990917411720374730, 0.983454654507193271051335159427}, + {0.180400117971807272265749588769, 0.983593308962478651835681375815}, + {0.179645658363882104735509415150, 0.983731384795162089318409925909}, + {0.178891093075044832483300183412, 0.983868881924017224527290181868}, + {0.178136422549186324015835225509, 0.984005800268157870824836663814}, + {0.177381647230260203196294810368, 0.984142139747038569019821352413}, + {0.176626767562280961865184281123, 0.984277900280454365322668763838}, + {0.175871783989325042307783064643, 0.984413081788540700323153487261}, + {0.175116696955530060098027433924, 0.984547684191773964101912497426}, + {0.174361506905093832653363961072, 0.984681707410970941118932842073}, + {0.173606214282275406191047295579, 0.984815151367289143280459029484}, + {0.172850819531394195305296079823, 0.984948015982227031983597953513}, + {0.172095323096829039277722017687, 0.985080301177623796071713968558}, + {0.171339725423019256789203268454, 0.985212006875659462856731352076}, + {0.170584026954463702230313515429, 0.985343132998854787096831842064}, + {0.169828228135719877522902265810, 0.985473679470071806107966949639}, + {0.169072329411405181120997553990, 0.985603646212513395674648108979}, + {0.168316331226194909609361616276, 0.985733033149723492094551602349}, + {0.167560234024823589971120441078, 0.985861840205586981156216097588}, + {0.166804038252083869364739143748, 0.985990067304330031205950035655}, + {0.166047744352825848990207191491, 0.986117714370520093147831630631}, + {0.165291352771957972267458103488, 0.986244781329065456354499019653}, + {0.164534863954446108902374135141, 0.986371268105216025823267500527}, + {0.163778278345312694463942193579, 0.986497174624562878086919681664}, + {0.163021596389637812851702847183, 0.986622500813038483258310407109}, + {0.162264818532558113828301316062, 0.986747246596916482985761831515}, + {0.161507945219266146885672696953, 0.986871411902812467609180657746}, + {0.160750976895011388201339741499, 0.986994996657682865937033511727}, + {0.159993914005098353259270993476, 0.987118000788826277513976492628}, + {0.159236756994887845850783492097, 0.987240424223882251375528085191}, + {0.158479506309796097651698687514, 0.987362266890832396271093784890}, + {0.157722162395293685754893431294, 0.987483528717999714530151322833}, + {0.156964725696906753915627064089, 0.987604209634049157173762978346}, + {0.156207196660216041106394868621, 0.987724309567986957780760803871}, + {0.155449575730855882316205907046, 0.987843828449161742710771250131}, + {0.154691863354515402040334492995, 0.987962766207263420881190540968}, + {0.153934059976937459568446797675, 0.988081122772324071945604373468}, + {0.153176166043917871828483612262, 0.988198898074717613226880530419}, + {0.152418182001306495854109357424, 0.988316092045159688694866417791}, + {0.151660108295005396916721451817, 0.988432704614708335100203839829}, + {0.150901945370970042015201784125, 0.988548735714763204818211761449}, + {0.150143693675208328430770166051, 0.988664185277066231982701083325}, + {0.149385353653779806570867094706, 0.988779053233701521463672179380}, + {0.148626925752796540391997837105, 0.988893339517095126822709971748}, + {0.147868410418422357999190808187, 0.989007044060015272357588855812}, + {0.147109808096871852445275408172, 0.989120166795572686169180087745}, + {0.146351119234411436442755416465, 0.989232707657220045049939471937}, + {0.145592344277358454185389291524, 0.989344666578752640617722136085}, + {0.144833483672080237658619239483, 0.989456043494307713181967756100}, + {0.144074537864995327884898301818, 0.989566838338365117877515331202}, + {0.143315507302571587544548492588, 0.989677051045747213642300721403}, + {0.142556392431327338954361039214, 0.989786681551618641172751722479}, + {0.141797193697830531400327913616, 0.989895729791486655990695453511}, + {0.141037911548697769692495285199, 0.990004195701200906398753431858}, + {0.140278546430595424387988146009, 0.990112079216953766547248960705}, + {0.139519098790238604834712532465, 0.990219380275280003367299741512}, + {0.138759569074390382015238287750, 0.990326098813057331682330186595}, + {0.137999957729862759991945608817, 0.990432234767505970118861569063}, + {0.137240265203515704461878499387, 0.990537788076188752128814485332}, + {0.136480491942256310089476301073, 0.990642758677011570078718705190}, + {0.135720638393040077263052012313, 0.990747146508222709115898396703}, + {0.134960705002868830426621116203, 0.990850951508413624324589363823}, + {0.134200692218792022591955515054, 0.990954173616518496636729196325}, + {0.133440600487905819404588214638, 0.991056812771814343854259732325}, + {0.132680430257352127698666777178, 0.991158868913921353716034445824}, + {0.131920181974319761231129177759, 0.991260341982802439808608596650}, + {0.131159856086043413725406026060, 0.991361231918763463610844155482}, + {0.130399453039802742937425250602, 0.991461538662453789605422116438}, + {0.129638973282923536389787955159, 0.991561262154865286078120334423}, + {0.128878417262776656659895024859, 0.991660402337333213296233225265}, + {0.128117785426777153201527426063, 0.991758959151536112486269303190}, + {0.127357078222385566856900140920, 0.991856932539495361744741330767}, + {0.126596296097105959210793457714, 0.991954322443575953194283556513}, + {0.125835439498487022813577596025, 0.992051128806485715827534477285}, + {0.125074508874121304025095469115, 0.992147351571276092663254075887}, + {0.124313504671644300958455175987, 0.992242990681341696657113971014}, + {0.123552427338735365536237509332, 0.992338046080420421723999879760}, + {0.122791277323116898578803102282, 0.992432517712593553760314080137}, + {0.122030055072553406114721497033, 0.992526405522286103710882798623}, + {0.121268761034852554092644538741, 0.992619709454266141435141435068}, + {0.120507395657864238569523251954, 0.992712429453645461840949337784}, + {0.119745959389479628143249101413, 0.992804565465879140795379953488}, + {0.118984452677632523975859157872, 0.992896117436765979213930677361}, + {0.118222875970297250369789310298, 0.992987085312448392038220390532}, + {0.117461229715489987035503816060, 0.993077469039412297213686997566}, + {0.116699514361267839279712177358, 0.993167268564487226711889888975}, + {0.115937730355727852682434786402, 0.993256483834846437552812403737}, + {0.115175878147008178831178781820, 0.993345114798006911804861829296}, + {0.114413958183287048364640270393, 0.993433161401829356584869401559}, + {0.113651970912781924427648050369, 0.993520623594518093035787842382}, + {0.112889916783750474116310158479, 0.993607501324621611438203672151}, + {0.112127796244489749688533208882, 0.993693794541031683031917509652}, + {0.111365609743335189363300230525, 0.993779503192984581261271159747}, + {0.110603357728661907954936793885, 0.993864627230059749507518063183}, + {0.109841040648882684593878877877, 0.993949166602181133356452846783}, + {0.109078658952449239483151188779, 0.994033121259616403442294085835}, + {0.108316213087851304086584036668, 0.994116491152977066469986766606}, + {0.107553703503615705194818019663, 0.994199276233218909304412136407}, + {0.106791130648307378003813994383, 0.994281476451641554881177853531}, + {0.106028494970528533447584607075, 0.994363091759888573228920449765}, + {0.105265796918917645119684323163, 0.994444122109948036580817642971}, + {0.104503036942150545618446244589, 0.994524567454151742218471099477}, + {0.103740215488939482857411178429, 0.994604427745175656561116284138}, + {0.102977333008032245764695744583, 0.994683702936040248232529847883}, + {0.102214389948213371650531655632, 0.994762392980109932949517315137}, + {0.101451386758302161683609199372, 0.994840497831093184544215546339}, + {0.100688323887153971525343365556, 0.994918017443043201097907513031}, + {0.099925201783659226006939491072, 0.994994951770357016762602597737}, + {0.099162020896742572584336983255, 0.995071300767776167894851369056}, + {0.098398781675363880538931482533, 0.995147064390386471011140656628}, + {0.097635484568517338921367354487, 0.995222242593618244832498476171}, + {0.096872130025230526739754566279, 0.995296835333246088239889104443}, + {0.096108718494565467671542080552, 0.995370842565388991296515541762}, + {0.095345250425617741885098155308, 0.995444264246510335247819512006}, + {0.094581726267515472961200373447, 0.995517100333418114566086387640}, + {0.093818146469420493627211499188, 0.995589350783264603883537802176}, + {0.093054511480527332678569507607, 0.995661015553546913103843962745}, + {0.092290821750062354555943500145, 0.995732094602106432290611337521}, + {0.091527077727284980590560792280, 0.995802587887129164734290043270}, + {0.090763279861485704480550396056, 0.995872495367145726952173845348}, + {0.089999428601987341291845723390, 0.995941817001031348688400157698}, + {0.089235524398144139279764885941, 0.996010552748005872913950042857}, + {0.088471567699340822321651955917, 0.996078702567633977871253136982}, + {0.087707558954993644628750359971, 0.996146266419824621962675337272}, + {0.086943498614549488689995371260, 0.996213244264832042951240964612}, + {0.086179387127484921582443178067, 0.996279636063254647737608138414}, + {0.085415224943307277438719893325, 0.996345441776035900538488476741}, + {0.084651012511553699879662815420, 0.996410661364464100842042171280}, + {0.083886750281790226080325112434, 0.996475294790172161363273062307}, + {0.083122438703613077404241948898, 0.996539342015137941110936026234}, + {0.082358078226646619368622737056, 0.996602803001684134365234513098}, + {0.081593669300544638400829455804, 0.996665677712478159655518084037}, + {0.080829212374989467537744758374, 0.996727966110532492827189798845}, + {0.080064707899690931713898578437, 0.996789668159204556019403753453}, + {0.079300156324387569006795217774, 0.996850783822196606642762617412}, + {0.078535558098845589802827760195, 0.996911313063555737379317633895}, + {0.077770913672857988618858371410, 0.996971255847674320271778469760}, + {0.077006223496245584936303885115, 0.997030612139289451612000902969}, + {0.076241488018856148900503910681, 0.997089381903483396030196672655}, + {0.075476707690563415997786478329, 0.997147565105683475472631016601}, + {0.074711882961268377689734165870, 0.997205161711661847157017746213}, + {0.073947014280897269133951965614, 0.997262171687536169706334021612}, + {0.073182102099402887573909026742, 0.997318594999768603948098188994}, + {0.072417146866763537627065261404, 0.997374431615167034159696868301}, + {0.071652149032982254128754107114, 0.997429681500884179889965253096}, + {0.070887109048087787455116881574, 0.997484344624417929026094498113}, + {0.070122027362133645955744043476, 0.997538420953611226771329256735}, + {0.069356904425197235530831108008, 0.997591910456652630756479993579}, + {0.068591740687380900465264232935, 0.997644813102075422861503284366}, + {0.067826536598810965861261479404, 0.997697128858758497393921516050}, + {0.067061292609636835582165304004, 0.997748857695925694955008111720}, + {0.066296009170032282886708685510, 0.997799999583146468573602305696}, + {0.065530686730193396516419568343, 0.997850554490335106549991905922}, + {0.064765325740339871329886989315, 0.997900522387751620634332994086}, + {0.063999926650714078490977954061, 0.997949903246001190915137613047}, + {0.063234489911580135657054313469, 0.997998697036034387863878691860}, + {0.062469015973224968629740061488, 0.998046903729146839268082658236}, + {0.061703505285957416237607731091, 0.998094523296980007387446676148}, + {0.060937958300107238074350135548, 0.998141555711520522820023870736}, + {0.060172375466026217782911089671, 0.998188000945100295524525790825}, + {0.059406757234087247121490094059, 0.998233858970396847887229796470}, + {0.058641104054683347579501884184, 0.998279129760433203699676596443}, + {0.057875416378229016522993788385, 0.998323813288577555091762860684}, + {0.057109694655158131648686747894, 0.998367909528543817643253532879}, + {0.056343939335925283251604867019, 0.998411418454391297316874442913}, + {0.055578150871004816657716673944, 0.998454340040524801480614769389}, + {0.054812329710889909351045901076, 0.998496674261694638907727039623}, + {0.054046476306093639563332686748, 0.998538421092996730799029592163}, + {0.053280591107148056462250451659, 0.998579580509872499760604114272}, + {0.052514674564603257278516679207, 0.998620152488108869803795641928}, + {0.051748727129028414262190693762, 0.998660137003838488389817484858}, + {0.050982749251010900382041768353, 0.998699534033539282340541376470}, + {0.050216741381155324819296481564, 0.998738343554035234994614711468}, + {0.049450703970084823601904844281, 0.998776565542495609051343308238}, + {0.048684637468439019569732550963, 0.998814199976435390659901258914}, + {0.047918542326875326886614914201, 0.998851246833715178397028466861}, + {0.047152418996068000411892029433, 0.998887706092541294289333109191}, + {0.046386267926707212827519555276, 0.998923577731465783813291636761}, + {0.045620089569500123227729915243, 0.998958861729386082828341386630}, + {0.044853884375169933429461366359, 0.998993558065545683710695357149}, + {0.044087652794454978977256587314, 0.999027666719533691264132357901}, + {0.043321395278109783855136072361, 0.999061187671284600675392084668}, + {0.042555112276904116797027199937, 0.999094120901079074670292357041}, + {0.041788804241622082291662820808, 0.999126466389543388402216805844}, + {0.041022471623063397339059577007, 0.999158224117649429452114873129}, + {0.040256114872041358354604057013, 0.999189394066714919873106737214}, + {0.039489734439384117925531114679, 0.999219976218403527212785775191}, + {0.038723330775933761938034649575, 0.999249970554724420424008712871}, + {0.037956904332545365887696675600, 0.999279377058032713954105474841}, + {0.037190455560088091224724138328, 0.999308195711029467744879184465}, + {0.036423984909444227786590175810, 0.999336426496761243143396313826}, + {0.035657492831508263986250995004, 0.999364069398620546991196533781}, + {0.034890979777187955401807073486, 0.999391124400346053668897639000}, + {0.034124446197403422720295651516, 0.999417591486021716917775847833}, + {0.033357892543086159475862473300, 0.999443470640077769040487964958}, + {0.032591319265180385134073048903, 0.999468761847290054767256606283}, + {0.031824726814640963423741482075, 0.999493465092780586367382511526}, + {0.031058115642434699910090500907, 0.999517580362016988537732231634}, + {0.030291486199539422591309190125, 0.999541107640812942491947978851}, + {0.029524838936943034739535107747, 0.999564046915327741871237776650}, + {0.028758174305644590429409390708, 0.999586398172067069900492697343}, + {0.027991492756653364726293631293, 0.999608161397882111209867161961}, + {0.027224794740987909996698945747, 0.999629336579970106946291252825}, + {0.026458080709677145314628887718, 0.999649923705874243751168251038}, + {0.025691351113759395424773757100, 0.999669922763483764782677098992}, + {0.024924606404281485216856140141, 0.999689333741033636648865012830}, + {0.024157847032300019951556180331, 0.999708156627104882474554869987}, + {0.023391073448879338286809925762, 0.999726391410624470879042746674}, + {0.022624286105092802912075455879, 0.999744038080865426998400380398}, + {0.021857485452021874205996709861, 0.999761096627446610440870244929}, + {0.021090671940755180424620363056, 0.999777567040332937331470475328}, + {0.020323846022389572413269220874, 0.999793449309835269289692405437}, + {0.019557008148029204203099951087, 0.999808743426610524451803030388}, + {0.018790158768784596260426056347, 0.999823449381661566448542544094}, + {0.018023298335773700606932123947, 0.999837567166337093382821876730}, + {0.017256427300120977946784606161, 0.999851096772332192941235007311}, + {0.016489546112956453977060888860, 0.999864038191687676260244188597}, + {0.015722655225417016960909322165, 0.999876391416790410993087334646}, + {0.014955755088644377692741471719, 0.999888156440373321309778020805}, + {0.014188846153786342785263485666, 0.999899333255515387897105483717}, + {0.013421928871995907409098158780, 0.999909921855641536936332158803}, + {0.012655003694430301194873145221, 0.999919922234522751125496142777}, + {0.011888071072252072435393444039, 0.999929334386276069679411193647}, + {0.011121131456628140926623515838, 0.999938158305364588329666730715}, + {0.010354185298728883768415443001, 0.999946393986597459324627834576}, + {0.009587233049729183137488419675, 0.999954041425129780407132784603}, + {0.008820275160807512088156912000, 0.999961100616462816859097983979}, + {0.008053312083144990862759726724, 0.999967571556443779456913034664}, + {0.007286344267926683597458303865, 0.999973454241265935493743199913}, + {0.006519372166339548746449850114, 0.999978748667468830824134329305}, + {0.005752396229573736655127369488, 0.999983454831937734752500546165}, + {0.004985416908821651942040897865, 0.999987572731904084122334097628}, + {0.004218434655277023687114379413, 0.999991102364945594338507817156}, + {0.003451449920135974454987737303, 0.999994043728985815278065274470}, + {0.002684463154596083110658977233, 0.999996396822294353334825700585}, + {0.001917474809855459778190622799, 0.999998161643486982441686450329}, + {0.001150485337113808575679185786, 0.999999338191525533048320539820}, + {0.000383495187571497152950739107, 0.999999926465717892121176646469}, + {-0.000383495187571374692315356869, 0.999999926465717892121176646469}, + {-0.001150485337113686060833694924, 0.999999338191525533048320539820}, + {-0.001917474809855337480185566434, 0.999998161643486982441686450329}, + {-0.002684463154595960812653920868, 0.999996396822294353334825700585}, + {-0.003451449920135851723301811944, 0.999994043728985815278065274470}, + {-0.004218434655276901389109323048, 0.999991102364945594338507817156}, + {-0.004985416908821529644035841500, 0.999987572731904084122334097628}, + {-0.005752396229573614357122313123, 0.999983454831937734752500546165}, + {-0.006519372166339426448444793749, 0.999978748667468830824134329305}, + {-0.007286344267926560432091509512, 0.999973454241265935493743199913}, + {-0.008053312083144869432116408348, 0.999967571556443779456913034664}, + {-0.008820275160807390657513593624, 0.999961100616462816859097983979}, + {-0.009587233049729061706845101298, 0.999954041425129780407132784603}, + {-0.010354185298728760603048648647, 0.999946393986597459324627834576}, + {-0.011121131456628019495980197462, 0.999938158305364588329666730715}, + {-0.011888071072251949270026649685, 0.999929334386276069679411193647}, + {-0.012655003694430179764229826844, 0.999919922234522751125496142777}, + {-0.013421928871995784243731364427, 0.999909921855641536936332158803}, + {-0.014188846153786221354620167290, 0.999899333255515387897105483717}, + {-0.014955755088644254527374677366, 0.999888156440373321309778020805}, + {-0.015722655225416895530266003789, 0.999876391416790410993087334646}, + {-0.016489546112956332546417570484, 0.999864038191687676260244188597}, + {-0.017256427300120856516141287784, 0.999851096772332192941235007311}, + {-0.018023298335773579176288805570, 0.999837567166337093382821876730}, + {-0.018790158768784474829782737970, 0.999823449381661566448542544094}, + {-0.019557008148029082772456632711, 0.999808743426610524451803030388}, + {-0.020323846022389450982625902498, 0.999793449309835269289692405437}, + {-0.021090671940755058993977044679, 0.999777567040332937331470475328}, + {-0.021857485452021752775353391485, 0.999761096627446610440870244929}, + {-0.022624286105092681481432137502, 0.999744038080865426998400380398}, + {-0.023391073448879216856166607386, 0.999726391410624470879042746674}, + {-0.024157847032299898520912861954, 0.999708156627104882474554869987}, + {-0.024924606404281363786212821765, 0.999689333741033636648865012830}, + {-0.025691351113759270524683486769, 0.999669922763483764782677098992}, + {-0.026458080709677020414538617388, 0.999649923705874243751168251038}, + {-0.027224794740987788566055627371, 0.999629336579970106946291252825}, + {-0.027991492756653243295650312916, 0.999608161397882111209867161961}, + {-0.028758174305644468998766072332, 0.999586398172067069900492697343}, + {-0.029524838936942913308891789370, 0.999564046915327741871237776650}, + {-0.030291486199539301160665871748, 0.999541107640812942491947978851}, + {-0.031058115642434578479447182531, 0.999517580362016988537732231634}, + {-0.031824726814640838523651211744, 0.999493465092780586367382511526}, + {-0.032591319265180260233982778573, 0.999468761847290054767256606283}, + {-0.033357892543086034575772202970, 0.999443470640077769040487964958}, + {-0.034124446197403297820205381186, 0.999417591486021716917775847833}, + {-0.034890979777187837440610707063, 0.999391124400346053668897639000}, + {-0.035657492831508139086160724673, 0.999364069398620546991196533781}, + {-0.036423984909444102886499905480, 0.999336426496761243143396313826}, + {-0.037190455560087973263527771906, 0.999308195711029467744879184465}, + {-0.037956904332545240987606405270, 0.999279377058032713954105474841}, + {-0.038723330775933637037944379244, 0.999249970554724420424008712871}, + {-0.039489734439383993025440844349, 0.999219976218403527212785775191}, + {-0.040256114872041240393407690590, 0.999189394066714919873106737214}, + {-0.041022471623063279377863210584, 0.999158224117649429452114873129}, + {-0.041788804241621957391572550478, 0.999126466389543388402216805844}, + {-0.042555112276903991896936929606, 0.999094120901079074670292357041}, + {-0.043321395278109658955045802031, 0.999061187671284600675392084668}, + {-0.044087652794454861016060220891, 0.999027666719533691264132357901}, + {-0.044853884375169808529371096029, 0.998993558065545683710695357149}, + {-0.045620089569499998327639644913, 0.998958861729386082828341386630}, + {-0.046386267926707094866323188853, 0.998923577731465783813291636761}, + {-0.047152418996067882450695663010, 0.998887706092541294289333109191}, + {-0.047918542326875208925418547778, 0.998851246833715178397028466861}, + {-0.048684637468438894669642280633, 0.998814199976435390659901258914}, + {-0.049450703970084698701814573951, 0.998776565542495609051343308238}, + {-0.050216741381155199919206211234, 0.998738343554035234994614711468}, + {-0.050982749251010775481951498023, 0.998699534033539282340541376470}, + {-0.051748727129028289362100423432, 0.998660137003838488389817484858}, + {-0.052514674564603132378426408877, 0.998620152488108869803795641928}, + {-0.053280591107147938501054085236, 0.998579580509872499760604114272}, + {-0.054046476306093514663242416418, 0.998538421092996730799029592163}, + {-0.054812329710889784450955630746, 0.998496674261694638907727039623}, + {-0.055578150871004691757626403614, 0.998454340040524801480614769389}, + {-0.056343939335925165290408500596, 0.998411418454391297316874442913}, + {-0.057109694655158013687490381471, 0.998367909528543817643253532879}, + {-0.057875416378228891622903518055, 0.998323813288577555091762860684}, + {-0.058641104054683229618305517761, 0.998279129760433203699676596443}, + {-0.059406757234087122221399823729, 0.998233858970396847887229796470}, + {-0.060172375466026099821714723248, 0.998188000945100295524525790825}, + {-0.060937958300107113174259865218, 0.998141555711520522820023870736}, + {-0.061703505285957291337517460761, 0.998094523296980007387446676148}, + {-0.062469015973224850668543695065, 0.998046903729146839268082658236}, + {-0.063234489911580010756964043139, 0.997998697036034387863878691860}, + {-0.063999926650713953590887683731, 0.997949903246001190915137613047}, + {-0.064765325740339746429796718985, 0.997900522387751731656635456602}, + {-0.065530686730193285494117105827, 0.997850554490335106549991905922}, + {-0.066296009170032171864406222994, 0.997799999583146468573602305696}, + {-0.067061292609636710682075033674, 0.997748857695925694955008111720}, + {-0.067826536598810840961171209074, 0.997697128858758497393921516050}, + {-0.068591740687380775565173962605, 0.997644813102075533883805746882}, + {-0.069356904425197110630740837678, 0.997591910456652630756479993579}, + {-0.070122027362133521055653773146, 0.997538420953611337793631719251}, + {-0.070887109048087662555026611244, 0.997484344624417929026094498113}, + {-0.071652149032982143106451644599, 0.997429681500884179889965253096}, + {-0.072417146866763412726974991074, 0.997374431615167145181999330816}, + {-0.073182102099402762673818756411, 0.997318594999768714970400651509}, + {-0.073947014280897158111649503098, 0.997262171687536169706334021612}, + {-0.074711882961268252789643895539, 0.997205161711661847157017746213}, + {-0.075476707690563291097696207999, 0.997147565105683475472631016601}, + {-0.076241488018856024000413640351, 0.997089381903483396030196672655}, + {-0.077006223496245460036213614785, 0.997030612139289451612000902969}, + {-0.077770913672857863718768101080, 0.996971255847674320271778469760}, + {-0.078535558098845464902737489865, 0.996911313063555737379317633895}, + {-0.079300156324387457984492755259, 0.996850783822196606642762617412}, + {-0.080064707899690806813808308107, 0.996789668159204556019403753453}, + {-0.080829212374989342637654488044, 0.996727966110532492827189798845}, + {-0.081593669300544527378526993289, 0.996665677712478159655518084037}, + {-0.082358078226646494468532466726, 0.996602803001684134365234513098}, + {-0.083122438703612952504151678568, 0.996539342015137941110936026234}, + {-0.083886750281790101180234842104, 0.996475294790172161363273062307}, + {-0.084651012511553574979572545089, 0.996410661364464100842042171280}, + {-0.085415224943307166416417430810, 0.996345441776035900538488476741}, + {-0.086179387127484810560140715552, 0.996279636063254647737608138414}, + {-0.086943498614549363789905100930, 0.996213244264832042951240964612}, + {-0.087707558954993519728660089640, 0.996146266419824732984977799788}, + {-0.088471567699340697421561685587, 0.996078702567633977871253136982}, + {-0.089235524398144014379674615611, 0.996010552748005872913950042857}, + {-0.089999428601987216391755453060, 0.995941817001031348688400157698}, + {-0.090763279861485579580460125726, 0.995872495367145726952173845348}, + {-0.091527077727284855690470521949, 0.995802587887129164734290043270}, + {-0.092290821750062229655853229815, 0.995732094602106432290611337521}, + {-0.093054511480527221656267045091, 0.995661015553546913103843962745}, + {-0.093818146469420368727121228858, 0.995589350783264603883537802176}, + {-0.094581726267515348061110103117, 0.995517100333418114566086387640}, + {-0.095345250425617616985007884978, 0.995444264246510335247819512006}, + {-0.096108718494565342771451810222, 0.995370842565388991296515541762}, + {-0.096872130025230401839664295949, 0.995296835333246088239889104443}, + {-0.097635484568517214021277084157, 0.995222242593618355854800938687}, + {-0.098398781675363755638841212203, 0.995147064390386471011140656628}, + {-0.099162020896742447684246712925, 0.995071300767776167894851369056}, + {-0.099925201783659101106849220741, 0.994994951770357016762602597737}, + {-0.100688323887153846625253095226, 0.994918017443043201097907513031}, + {-0.101451386758302050661306736856, 0.994840497831093184544215546339}, + {-0.102214389948213246750441385302, 0.994762392980109932949517315137}, + {-0.102977333008032120864605474253, 0.994683702936040248232529847883}, + {-0.103740215488939357957320908099, 0.994604427745175656561116284138}, + {-0.104503036942150420718355974259, 0.994524567454151742218471099477}, + {-0.105265796918917520219594052833, 0.994444122109948036580817642971}, + {-0.106028494970528408547494336744, 0.994363091759888573228920449765}, + {-0.106791130648307253103723724053, 0.994281476451641554881177853531}, + {-0.107553703503615580294727749333, 0.994199276233218909304412136407}, + {-0.108316213087851179186493766338, 0.994116491152977066469986766606}, + {-0.109078658952449114583060918449, 0.994033121259616403442294085835}, + {-0.109841040648882559693788607547, 0.993949166602181133356452846783}, + {-0.110603357728661783054846523555, 0.993864627230059749507518063183}, + {-0.111365609743335064463209960195, 0.993779503192984581261271159747}, + {-0.112127796244489624788442938552, 0.993693794541031794054219972168}, + {-0.112889916783750349216219888149, 0.993607501324621611438203672151}, + {-0.113651970912781799527557780038, 0.993520623594518093035787842382}, + {-0.114413958183286937342337807877, 0.993433161401829356584869401559}, + {-0.115175878147008053931088511490, 0.993345114798006911804861829296}, + {-0.115937730355727741660132323887, 0.993256483834846437552812403737}, + {-0.116699514361267714379621907028, 0.993167268564487226711889888975}, + {-0.117461229715489876013201353544, 0.993077469039412297213686997566}, + {-0.118222875970297125469699039968, 0.992987085312448392038220390532}, + {-0.118984452677632399075768887542, 0.992896117436765979213930677361}, + {-0.119745959389479503243158831083, 0.992804565465879140795379953488}, + {-0.120507395657864113669432981624, 0.992712429453645461840949337784}, + {-0.121268761034852443070342076226, 0.992619709454266252457443897583}, + {-0.122030055072553295092419034518, 0.992526405522286103710882798623}, + {-0.122791277323116773678712831952, 0.992432517712593553760314080137}, + {-0.123552427338735240636147239002, 0.992338046080420421723999879760}, + {-0.124313504671644189936152713472, 0.992242990681341696657113971014}, + {-0.125074508874121193002793006599, 0.992147351571276092663254075887}, + {-0.125835439498486884035699517881, 0.992051128806485826849836939800}, + {-0.126596296097105820432915379570, 0.991954322443575953194283556513}, + {-0.127357078222385455834597678404, 0.991856932539495472767043793283}, + {-0.128117785426777014423649347918, 0.991758959151536112486269303190}, + {-0.128878417262776545637592562343, 0.991660402337333213296233225265}, + {-0.129638973282923425367485492643, 0.991561262154865286078120334423}, + {-0.130399453039802631915122788087, 0.991461538662453789605422116438}, + {-0.131159856086043274947527947916, 0.991361231918763463610844155482}, + {-0.131920181974319622453251099614, 0.991260341982802439808608596650}, + {-0.132680430257352016676364314662, 0.991158868913921353716034445824}, + {-0.133440600487905680626710136494, 0.991056812771814343854259732325}, + {-0.134200692218791911569653052538, 0.990954173616518496636729196325}, + {-0.134960705002868719404318653687, 0.990850951508413624324589363823}, + {-0.135720638393039966240749549797, 0.990747146508222709115898396703}, + {-0.136480491942256199067173838557, 0.990642758677011570078718705190}, + {-0.137240265203515565684000421243, 0.990537788076188752128814485332}, + {-0.137999957729862621214067530673, 0.990432234767505970118861569063}, + {-0.138759569074390270992935825234, 0.990326098813057442704632649111}, + {-0.139519098790238493812410069950, 0.990219380275280003367299741512}, + {-0.140278546430595285610110067864, 0.990112079216953766547248960705}, + {-0.141037911548697658670192822683, 0.990004195701200906398753431858}, + {-0.141797193697830420378025451100, 0.989895729791486655990695453511}, + {-0.142556392431327227932058576698, 0.989786681551618641172751722479}, + {-0.143315507302571476522246030072, 0.989677051045747213642300721403}, + {-0.144074537864995216862595839302, 0.989566838338365117877515331202}, + {-0.144833483672080126636316776967, 0.989456043494307713181967756100}, + {-0.145592344277358343163086829009, 0.989344666578752640617722136085}, + {-0.146351119234411325420452953949, 0.989232707657220156072241934453}, + {-0.147109808096871713667397330028, 0.989120166795572686169180087745}, + {-0.147868410418422219221312730042, 0.989007044060015272357588855812}, + {-0.148626925752796401614119758960, 0.988893339517095126822709971748}, + {-0.149385353653779667792989016561, 0.988779053233701521463672179380}, + {-0.150143693675208217408467703535, 0.988664185277066231982701083325}, + {-0.150901945370969930992899321609, 0.988548735714763204818211761449}, + {-0.151660108295005285894418989301, 0.988432704614708335100203839829}, + {-0.152418182001306384831806894908, 0.988316092045159688694866417791}, + {-0.153176166043917760806181149746, 0.988198898074717613226880530419}, + {-0.153934059976937348546144335160, 0.988081122772324071945604373468}, + {-0.154691863354515263262456414850, 0.987962766207263531903493003483}, + {-0.155449575730855771293903444530, 0.987843828449161742710771250131}, + {-0.156207196660215902328516790476, 0.987724309567986957780760803871}, + {-0.156964725696906642893324601573, 0.987604209634049157173762978346}, + {-0.157722162395293546977015353150, 0.987483528717999714530151322833}, + {-0.158479506309795958873820609369, 0.987362266890832396271093784890}, + {-0.159236756994887734828481029581, 0.987240424223882251375528085191}, + {-0.159993914005098242236968530960, 0.987118000788826277513976492628}, + {-0.160750976895011277179037278984, 0.986994996657682976959335974243}, + {-0.161507945219266035863370234438, 0.986871411902812467609180657746}, + {-0.162264818532558002805998853546, 0.986747246596916594008064294030}, + {-0.163021596389637674073824769039, 0.986622500813038483258310407109}, + {-0.163778278345312583441639731063, 0.986497174624562878086919681664}, + {-0.164534863954445970124496056997, 0.986371268105216025823267500527}, + {-0.165291352771957861245155640972, 0.986244781329065456354499019653}, + {-0.166047744352825737967904728976, 0.986117714370520093147831630631}, + {-0.166804038252083758342436681232, 0.985990067304330142228252498171}, + {-0.167560234024823451193242362933, 0.985861840205586981156216097588}, + {-0.168316331226194798587059153760, 0.985733033149723492094551602349}, + {-0.169072329411405042343119475845, 0.985603646212513395674648108979}, + {-0.169828228135719766500599803294, 0.985473679470071806107966949639}, + {-0.170584026954463591208011052913, 0.985343132998854787096831842064}, + {-0.171339725423019145766900805938, 0.985212006875659462856731352076}, + {-0.172095323096828928255419555171, 0.985080301177623796071713968558}, + {-0.172850819531394084282993617308, 0.984948015982227031983597953513}, + {-0.173606214282275267413169217434, 0.984815151367289143280459029484}, + {-0.174361506905093693875485882927, 0.984681707410970941118932842073}, + {-0.175116696955529949075724971408, 0.984547684191773964101912497426}, + {-0.175871783989324931285480602128, 0.984413081788540811345455949777}, + {-0.176626767562280850842881818608, 0.984277900280454365322668763838}, + {-0.177381647230260092173992347853, 0.984142139747038569019821352413}, + {-0.178136422549186185237957147365, 0.984005800268157870824836663814}, + {-0.178891093075044721460997720897, 0.983868881924017224527290181868}, + {-0.179645658363881993713206952634, 0.983731384795162200340712388424}, + {-0.180400117971807133487871510624, 0.983593308962478651835681375815}, + {-0.181154471454990806389417912214, 0.983454654507193271051335159427}, + {-0.181908718369666017045105377292, 0.983315421510872811339254440099}, + {-0.182662858272129219328050453441, 0.983175610055424420430369991664}, + {-0.183416890718739122867475543899, 0.983035220223095640434962660947}, + {-0.184170815265917608982704223308, 0.982894252096474185798058442742}, + {-0.184924631470150729883883400362, 0.982752705758487832277126017289}, + {-0.185678338887987681715685539530, 0.982610581292404750008984137821}, + {-0.186431937076041526202274667412, 0.982467878781833170442894243024}, + {-0.187185425590990300870330997896, 0.982324598310721275318257994513}, + {-0.187938803989575742292572613223, 0.982180739963357196664617276838}, + {-0.188692071828605117955746095504, 0.982036303824369127823956659995}, + {-0.189445228664950199304328748440, 0.981891289978725101406098474399}, + {-0.190198274055548011141070219310, 0.981745698511733100311005273397}, + {-0.190951207557401747560987814722, 0.981599529509040724661872445722}, + {-0.191704028727579828261795569233, 0.981452783056635524872035603039}, + {-0.192456737123216731211172714211, 0.981305459240844668578063192399}, + {-0.193209332301513936336334609223, 0.981157558148334940639756496239}, + {-0.193961813819738898567734963763, 0.981009079866112632117847169866}, + {-0.194714181235225880506334306119, 0.980860024481523873340904629003}, + {-0.195466434105376951624322146017, 0.980710392082253967771521274699}, + {-0.196218571987660711508638655687, 0.980560182756327947117824805900}, + {-0.196970594439614260506843379517, 0.980409396592109905199663444364}, + {-0.197722501018841922970636915124, 0.980258033678303553060118247231}, + {-0.198474291283016246456583075997, 0.980106094103951774876293256966}, + {-0.199225964789878778882226129099, 0.979953577958436738981617963873}, + {-0.199977521097239180347671094751, 0.979800485331479786843544843578}, + {-0.200728959762976028047276599864, 0.979646816313141322041246894514}, + {-0.201480280345037704448074578067, 0.979492570993820810265617637924}, + {-0.202231482401441509111350569583, 0.979337749464256779319271117856}, + {-0.202982565490274352582034111947, 0.979182351815527041161146826198}, + {-0.203733529169693894367298980796, 0.979026378139047581683485077519}, + {-0.204484372997927071891055561537, 0.978869828526574115024061484291}, + {-0.205235096533272265428848868396, 0.978712703070200529253952481668}, + {-0.205985699334097910329077762981, 0.978555001862359552511350102577}, + {-0.206736180958843551724868348174, 0.978396724995823086068469365273}, + {-0.207486540966020593934615590115, 0.978237872563701094108523648174}, + {-0.208236778914211356772412386817, 0.978078444659442380881841927476}, + {-0.208986894362069963726469268295, 0.977918441376834368661263852118}, + {-0.209736886868323257893109712313, 0.977757862810002764675232356240}, + {-0.210486755991769775020472366123, 0.977596709053411894174701046722}, + {-0.211236501291280603931355130953, 0.977434980201864256343924353132}, + {-0.211986122325800302457210477769, 0.977272676350500857367364915262}, + {-0.212735618654345731703969590853, 0.977109797594800877362786195590}, + {-0.213484989836007971186759846205, 0.976946344030581670381252479274}, + {-0.214234235429950986562275261349, 0.976782315753998653384826411639}, + {-0.214983354995412684340649889236, 0.976617712861545639313476385723}, + {-0.215732348091705800063877518369, 0.976452535450054059928959304671}, + {-0.216481214278216760327211432013, 0.976286783616693631948635356821}, + {-0.217229953114406654224310955215, 0.976120457458971912956258165650}, + {-0.217978564159812177036812386177, 0.975953557074734301401974789769}, + {-0.218727046974044464500153139852, 0.975786082562163925580023260409}, + {-0.219475401116790203026596373093, 0.975618034019781754651035043935}, + {-0.220223626147812351350196991007, 0.975449411546446376597430116817}, + {-0.220971721626948947037050174913, 0.975280215241354220268021890661}, + {-0.221719687114115132642311323252, 0.975110445204038889244202437112}, + {-0.222467522169301878953717732657, 0.974940101534371827973757262953}, + {-0.223215226352576845414432682446, 0.974769184332561766659352997522}, + {-0.223962799224085407079343212899, 0.974597693699155054325444780261}, + {-0.224710240344049433369733037580, 0.974425629735034992684461485624}, + {-0.225457549272768426051882784122, 0.974252992541422613292922960682}, + {-0.226204725570620157615309153698, 0.974079782219875678350717862486}, + {-0.226951768798059866361072067775, 0.973905998872289457857220895676}, + {-0.227698678515621061313467521359, 0.973731642600896396544385424932}, + {-0.228445454283916438154022898743, 0.973556713508265558765231162397}, + {-0.229192095663636602465018654584, 0.973381211697303294627658942773}, + {-0.229938602215552123642083870436, 0.973205137271252795905240873253}, + {-0.230684973500512202626566704566, 0.973028490333694207059522796044}, + {-0.231431209079445615595105323337, 0.972851270988544181150814438297}, + {-0.232177308513361629893623216958, 0.972673479340056434949701724690}, + {-0.232923271363348977081031421221, 0.972495115492821193825534464850}, + {-0.233669097190576713352072601992, 0.972316179551765413791031278379}, + {-0.234414785556295107715740755339, 0.972136671622152226390767282282}, + {-0.235160336021834753816861507403, 0.971956591809581715857291328575}, + {-0.235905748148607263825482505126, 0.971775940219990141955008766672}, + {-0.236651021498106350904322425777, 0.971594716959650162024786368420}, + {-0.237396155631906441429990195502, 0.971412922135170942006254790613}, + {-0.238141150111664756661156161499, 0.971230555853497379281691337383}, + {-0.238886004499120035982073773084, 0.971047618221911101876742122840}, + {-0.239630718356093425080999281818, 0.970864109348029469259699908434}, + {-0.240375291244489364128611441629, 0.970680029339806127453016415529}, + {-0.241119722726294616332864961805, 0.970495378305530564944092475343}, + {-0.241864012363579072850683360230, 0.970310156353828112685278028948}, + {-0.242608159718496779744256741651, 0.970124363593660277160779514816}, + {-0.243352164353284772246865941270, 0.969938000134323963230542631209}, + {-0.244096025830264073963604687378, 0.969751066085452140264067111275}, + {-0.244839743711840612805374917116, 0.969563561557013287028894410469}, + {-0.245583317560503888721257226280, 0.969375486659311391690607706551}, + {-0.246326746938828944344379578979, 0.969186841502986062835134362103}, + {-0.247070031409475254768892682478, 0.968997626199012418446443462017}, + {-0.247813170535187504706087224804, 0.968807840858700974884243350971}, + {-0.248556163878796476662813574876, 0.968617485593697535861679170921}, + {-0.249299011003218190518637698005, 0.968426560515983192445332861098}, + {-0.250041711471454541904080315362, 0.968235065737874323055223158008}, + {-0.250784264846594440179217144760, 0.968043001372022260397898207884}, + {-0.251526670691812614943927428612, 0.967850367531413624533342954237}, + {-0.252268928570370698505342943463, 0.967657164329369878785769287788}, + {-0.253011038045617864256087159447, 0.967463391879547551788220971503}, + {-0.253752998680989827473553077652, 0.967269050295937904415666253044}, + {-0.254494810040010677187893861628, 0.967074139692867040807300327288}, + {-0.255236471686291710447846980969, 0.966878660184995908366545336321}, + {-0.255977983183532264988002680184, 0.966682611887320186738747906929}, + {-0.256719344095520607407223678820, 0.966485994915169843721969300532}, + {-0.257460553986133100501376702596, 0.966288809384209690378497725760}, + {-0.258201612419334758374844795981, 0.966091055410438825923336025880}, + {-0.258942518959180467685854409865, 0.965892733110190859768806603824}, + {-0.259683273169813821912299545147, 0.965693842600133689479946497158}, + {-0.260423874615467898507858990342, 0.965494383997269611796809840598}, + {-0.261164322860466480147323409255, 0.965294357418934656500653090916}, + {-0.261904617469222444903209634504, 0.965093762982799696636959652096}, + {-0.262644758006239931180658686571, 0.964892600806868894203205400117}, + {-0.263384744036113227494411148655, 0.964690871009481032416488233139}, + {-0.264124575123527383091470710497, 0.964488573709308516512805908860}, + {-0.264864250833259207151826331028, 0.964285709025357484769358507037}, + {-0.265603770730176325098881306985, 0.964082277076968141571455817029}, + {-0.266343134379238066777872973034, 0.963878277983814313323307487735}, + {-0.267082341345496188100838708124, 0.963673711865903226403418102564}, + {-0.267821391194094204912801160390, 0.963468578843575951253797029494}, + {-0.268560283490267781569826865962, 0.963262879037507069313051033532}, + {-0.269299017799346118717807030407, 0.963056612568704339949476889160}, + {-0.270037593686750398980223053513, 0.962849779558509033527968767885}, + {-0.270776010717995896381893317084, 0.962642380128595709365413313208}, + {-0.271514268458690699592494866010, 0.962434414400972104708387178107}, + {-0.272252366474536544593831877137, 0.962225882497979134733157025039}, + {-0.272990304331329869391709053161, 0.962016784542290559478772138391}, + {-0.273728081594960537259453303705, 0.961807120656913538958576737059}, + {-0.274465697831413057983240832982, 0.961596890965187856004092736839}, + {-0.275203152606767253995911914899, 0.961386095590786249331927137973}, + {-0.275940445487197205665097499150, 0.961174734657714080476864637603}, + {-0.276677576038972306005092605119, 0.960962808290309777881077479833}, + {-0.277414543828458093344124790747, 0.960750316613243948715705755603}, + {-0.278151348422114919056724602342, 0.960537259751520156036974640301}, + {-0.278887989386500168009774824895, 0.960323637830474030607774693635}, + {-0.279624466288266593227973544344, 0.960109450975773937031476634729}, + {-0.280360778694163648161463697761, 0.959894699313420640685023954575}, + {-0.281096926171038208330799079704, 0.959679382969746752607420603454}, + {-0.281832908285833350081617254546, 0.959463502071417506655848228547}, + {-0.282568724605589627341117875403, 0.959247056745430093371851398842}, + {-0.283304374697445682240726227974, 0.959030047119113659981337605132}, + {-0.284039858128637245915371067895, 0.958812473320129310394577260013}, + {-0.284775174466498193215358014641, 0.958594335476470216228506160405}, + {-0.285510323278461264351335557876, 0.958375633716461172717515637487}, + {-0.286245304132057010182421663558, 0.958156368168758820758057481726}, + {-0.286980116594915457550740711667, 0.957936538962351535886341480364}, + {-0.287714760234765165591852564830, 0.957716146226558873166823104839}, + {-0.288449234619434058402021037182, 0.957495190091032566392925673426}, + {-0.289183539316850146683179900720, 0.957273670685755195819410801050}, + {-0.289917673895040750586815647694, 0.957051588141040965318495636893}, + {-0.290651637922133110336631034443, 0.956828942587535480335247939365}, + {-0.291385430966355607473872169066, 0.956605734156215081753771301010}, + {-0.292119052596036432589698961237, 0.956381962978387734075624848629}, + {-0.292852502379604695548209747358, 0.956157629185692137241403543158}, + {-0.293585779885591202642558528169, 0.955932732910098281742250492243}, + {-0.294318884682627457394232806109, 0.955707274283906560441437250120}, + {-0.295051816339446604242624516701, 0.955481253439748767775085980247}, + {-0.295784574424884261212298497412, 0.955254670510586989529144830158}, + {-0.296517158507877298667665399989, 0.955027525629714157950900244032}, + {-0.297249568157465782203274784479, 0.954799818930753718682069575152}, + {-0.297981802942791806909639262813, 0.954571550547659630758801085904}, + {-0.298713862433100219018200505161, 0.954342720614716477633976410289}, + {-0.299445746197739837146656327604, 0.954113329266538801043395778834}, + {-0.300177453806162009009028679429, 0.953883376638071767139592793683}, + {-0.300908984827921777149839499543, 0.953652862864590500358019653504}, + {-0.301640338832678767122530416600, 0.953421788081700305461652078520}, + {-0.302371515390195966244135661327, 0.953190152425336667540989310510}, + {-0.303102514070340944840609154198, 0.952957956031764696902541800227}, + {-0.303833334443086355847185586754, 0.952725199037579573158041057468}, + {-0.304563976078508935607658258959, 0.952491881579706434202137188549}, + {-0.305294438546791613298125867004, 0.952258003795399599056281658704}, + {-0.306024721418221734570153103050, 0.952023565822243567069449454721}, + {-0.306754824263192671374156361708, 0.951788567798152240762021847331}, + {-0.307484746652204044004008665070, 0.951553009861368592758879003668}, + {-0.308214488155861110474376118873, 0.951316892150465553967819687387}, + {-0.308944048344875599187986381366, 0.951080214804345125401141558541}, + {-0.309673426790066375069443438406, 0.950842977962238156131036248553}, + {-0.310402623062358773431412828359, 0.950605181763705342490311522852}, + {-0.311131636732785155086133954683, 0.950366826348635895804761730687}, + {-0.311860467372485961057293479826, 0.950127911857248097504680117709}, + {-0.312589114552708546845849468809, 0.949888438430089299124858825962}, + {-0.313317577844808958786870789481, 0.949648406208035589237681506347}, + {-0.314045856820250712804210024842, 0.949407815332291571408518393582}, + {-0.314773951050605960144679329460, 0.949166665944390808284936156269}, + {-0.315501860107555931467260279533, 0.948924958186195155462883121800}, + {-0.316229583562890381731591560310, 0.948682692199895094553596663900}, + {-0.316957120988508034287178816157, 0.948439868128009622161300740117}, + {-0.317684471956417913141024200741, 0.948196486113385694771693579241}, + {-0.318411636038737844156543133067, 0.947952546299198672841157531366}, + {-0.319138612807695787321193847674, 0.947708048828952209774456605373}, + {-0.319865401835630447369140938463, 0.947462993846477696813224156358}, + {-0.320592002694990219069381964800, 0.947217381495934818147475198202}, + {-0.321318414958334797049133157998, 0.946971211921810884781791628484}, + {-0.322044638198334509660014646215, 0.946724485268921167602229616023}, + {-0.322770671987770596533806610751, 0.946477201682408675331714675849}, + {-0.323496515899536596361230067487, 0.946229361307743821463134281657}, + {-0.324222169506637014624317316702, 0.945980964290724757326245253353}, + {-0.324947632382188322797134105713, 0.945732010777477150043068832019}, + {-0.325672904099419791013048097739, 0.945482500914453849460983292374}, + {-0.326397984231672544375157940522, 0.945232434848434999175026405283}, + {-0.327122872352400395623561735192, 0.944981812726528147550197900273}, + {-0.327847568035170844336079198911, 0.944730634696167803632249615475}, + {-0.328572070853663578127168420906, 0.944478900905115548169987960136}, + {-0.329296380381672693093975112788, 0.944226611501459811570668989589}, + {-0.330020496193105417059854289619, 0.943973766633615984922300867765}, + {-0.330744417861982775708185045005, 0.943720366450326308971341404686}, + {-0.331468144962440813827697638771, 0.943466411100659319011185743875}, + {-0.332191677068729207533692715515, 0.943211900734010622038283599977}, + {-0.332915013755212541024519623534, 0.942956835500102119596022021142}, + {-0.333638154596370806181937496149, 0.942701215548982007774725389027}, + {-0.334361099166798791948451707867, 0.942445041031024888233957881312}, + {-0.335083847041206472905372493187, 0.942188312096931768202523471700}, + {-0.335806397794420452562746959302, 0.941931028897729616389256079856}, + {-0.336528751001382242513670917106, 0.941673191584771474005322033918}, + {-0.337250906237150538391489362766, 0.941414800309736343741917607986}, + {-0.337972863076899721068713233763, 0.941155855224629189770269022119}, + {-0.338694621095921077902346496558, 0.940896356481780826719329979824}, + {-0.339416179869623302334247227918, 0.940636304233847586608874280500}, + {-0.340137538973531772246161608564, 0.940375698633811540894100744481}, + {-0.340858697983289327115841160776, 0.940114539834980278421028287994}, + {-0.341579656474657100684311217265, 0.939852827990986683381890998135}, + {-0.342300414023513577266299989788, 0.939590563255789157359743057896}, + {-0.343020970205855424417507038015, 0.939327745783671397283853821136}, + {-0.343741324597798492135325432173, 0.939064375729241951340497962519}, + {-0.344461476775576369568909740337, 0.938800453247434885106770252605}, + {-0.345181426315542494442922816233, 0.938535978493508671327560932696}, + {-0.345901172794168987323359942820, 0.938270951623047189116277877474}, + {-0.346620715788047206729061144870, 0.938005372791958946798729357397}, + {-0.347340054873889081399340739154, 0.937739242156476970890821576177}, + {-0.348059189628525611492904090483, 0.937472559873159139165466058330}, + {-0.348778119628908311877779624410, 0.937205326098887958607974724146}, + {-0.349496844452109489687074983522, 0.936937540990869899282245114591}, + {-0.350215363675321633696313483597, 0.936669204706636171486877628922}, + {-0.350933676875858246990702582480, 0.936400317404042059621360749588}, + {-0.351651783631154568610099886428, 0.936130879241267033208373504749}, + {-0.352369683518766518837139756215, 0.935860890376814635871483005758}, + {-0.353087376116372420042921476124, 0.935590350969512374312841984647}, + {-0.353804861001772052997438322564, 0.935319261178511607290886331612}, + {-0.354522137752887323003392339160, 0.935047621163287434598032632493}, + {-0.355239205947763259096916499402, 0.934775431083638697060678168782}, + {-0.355956065164566903824550081481, 0.934502691099687865516898455098}, + {-0.356672714981588145910507137160, 0.934229401371880818771842314163}, + {-0.357389154977240885990852348186, 0.933955562060986732575429414283}, + {-0.358105384730061648834720244849, 0.933681173328098412689257656893}, + {-0.358821403818710749078491062392, 0.933406235334631628752788401471}, + {-0.359537211821973068381907978619, 0.933130748242325225305648928043}, + {-0.360252808318756723160447563714, 0.932854712213241232809934899706}, + {-0.360968192888095174009066568033, 0.932578127409764534583302975079}, + {-0.361683365109145837923421140658, 0.932300993994602755776668345788}, + {-0.362398324561191198522891454559, 0.932023312130786485418809661496}, + {-0.363113070823639416673245250422, 0.931745081981668721304856717325}, + {-0.363827603476023497819369367789, 0.931466303710925092040895378886}, + {-0.364541922098002013630235751407, 0.931186977482553857043967582285}, + {-0.365256026269360212221926076381, 0.930907103460875129385954096506}, + {-0.365969915570008796912304660509, 0.930626681810531763971994223539}, + {-0.366683589579984814399438164401, 0.930345712696488580384368560772}, + {-0.367397047879452709473468985379, 0.930064196284032362882499000989}, + {-0.368110290048702937237834476036, 0.929782132738772193469856119918}, + {-0.368823315668153850488408806996, 0.929499522226638563715539476107}, + {-0.369536124318350645001629573017, 0.929216364913884040888092386012}, + {-0.370248715579966247712917493118, 0.928932660967082823866292073944}, + {-0.370961089033801927339339954415, 0.928648410553130521094544747029}, + {-0.371673244260786517223493774509, 0.928363613839244372627490520244}, + {-0.372385180841977248000773670356, 0.928078270992963139107700953900}, + {-0.373096898358560580266640727132, 0.927792382182146324609561816033}, + {-0.373808396391851260887051466852, 0.927505947574975175839995245042}, + {-0.374519674523293100154575085980, 0.927218967339951793960040049569}, + {-0.375230732334459915477964386810, 0.926931441645899134584851708496}, + {-0.375941569407054310136828689792, 0.926643370661961340850609758490}, + {-0.376652185322909505149624465048, 0.926354754557602855236098093883}, + {-0.377362579663988340072933169722, 0.926065593502609307741124666791}, + {-0.378072752012383883624124791822, 0.925775887667086738730404249509}, + {-0.378782701950320488393231244117, 0.925485637221461487911255971994}, + {-0.379492429060152625108770507723, 0.925194842336480527400510709413}, + {-0.380201932924365937349620025998, 0.924903503183211017635301232076}, + {-0.380911213125578018701133942159, 0.924611619933040085328457280411}, + {-0.381620269246537413554420936634, 0.924319192757675156535412952508}, + {-0.382329100870124394262461464677, 0.924026221829143956654206704115}, + {-0.383037707579352015851981150263, 0.923732707319793289180154260976}, + {-0.383746088957364894778123698416, 0.923438649402290367973478169006}, + {-0.384454244587440763236685370430, 0.923144048249621929080888094177}, + {-0.385162174052989858541451440033, 0.922848904035094119713278359995}, + {-0.385869876937555200679952349674, 0.922553216932332831312635335053}, + {-0.386577352824813869069942029455, 0.922256987115283033418222657929}, + {-0.387284601298575781314070809458, 0.921960214758209217755791087257}, + {-0.387991621942784803422910044901, 0.921662900035694843126066189143}, + {-0.388698414341519138393010734944, 0.921365043122642446427050799684}, + {-0.389404978078990993139996135142, 0.921066644194273531631722562452}, + {-0.390111312739546800543166682473, 0.920767703426128791832638853521}, + {-0.390817417907668496201978314275, 0.920468220994067110041214618832}, + {-0.391523293167972241679564149308, 0.920168197074266447366142074316}, + {-0.392228938105210256370725119268, 0.919867631843222954834971005766}, + {-0.392934352304269485234300418597, 0.919566525477751528505621081422}, + {-0.393639535350172764527343360896, 0.919264878154985365377172001899}, + {-0.394344486828079543450087385281, 0.918962690052375630322956112650}, + {-0.395049206323284773922921431222, 0.918659961347691900179768254020}, + {-0.395753693421219965298263332443, 0.918356692219021719658655911189}, + {-0.396457947707453850494374592017, 0.918052882844770490322616751655}, + {-0.397161968767691608839243144757, 0.917748533403661248541993700201}, + {-0.397865756187775643226700594823, 0.917443644074735220605987251474}, + {-0.398569309553686246250236990818, 0.917138215037350712499630844832}, + {-0.399272628451540823046883588177, 0.916832246471183998082210564462}, + {-0.399975712467595279075993630613, 0.916525738556228208864240514231}, + {-0.400678561188243242963125112510, 0.916218691472794222185882517806}, + {-0.401381174200016677122704322755, 0.915911105401509995083131343563}, + {-0.402083551089586932469899238640, 0.915602980523320231220907317038}, + {-0.402785691443763527175292438187, 0.915294317019487047026871096023}, + {-0.403487594849495201376754494049, 0.914985115071589305557608895469}, + {-0.404189260893870638824409979861, 0.914675374861522394454027562460}, + {-0.404890689164117634213369001372, 0.914365096571498559008261963754}, + {-0.405591879247603759317541971541, 0.914054280384046569096767598239}, + {-0.406292830731837362190361773173, 0.913742926482011386113413209387}, + {-0.406993543204466345919456671254, 0.913431035048554829103295560344}, + {-0.407694016253280056005792175711, 0.913118606267154242495109883748}, + {-0.408394249466208003607192722484, 0.912805640321603606324174506881}, + {-0.409094242431320809227912604911, 0.912492137396012648054011151544}, + {-0.409793994736831090897055673850, 0.912178097674807175643252321606}, + {-0.410493505971092409456701943782, 0.911863521342728522434128990426}, + {-0.411192775722600045718024830421, 0.911548408584833991241680450912}, + {-0.411891803579992110684315775870, 0.911232759586496188219939540431}, + {-0.412590589132048268794505929691, 0.910916574533403355928840028355}, + {-0.413289131967690848146190774060, 0.910599853611558929245006765996}, + {-0.413987431675985395607142436347, 0.910282597007281757406360611640}, + {-0.414685487846139899659192451509, 0.909964804907205770945211042999}, + {-0.415383300067506178177012543529, 0.909646477498279648621348769666}, + {-0.416080867929579212294299850328, 0.909327614967767261511255583173}, + {-0.416778191021997701515289236340, 0.909008217503247450963499431964}, + {-0.417475268934544452292811911320, 0.908688285292613251442617183784}, + {-0.418172101257146100472539274051, 0.908367818524073000752139250835}, + {-0.418868687579874998672124775112, 0.908046817386148341633145264495}, + {-0.419565027492946829301700972792, 0.907725282067676442210313325631}, + {-0.420261120586722936032231245918, 0.907403212757808108612778141833}, + {-0.420956966451709546639392556244, 0.907080609646008451107945802505}, + {-0.421652564678558106070482836003, 0.906757472922056662056888853840}, + {-0.422347914858066886267806694377, 0.906433802776045571825136448751}, + {-0.423043016581178987767231092221, 0.906109599398381981849581734423}, + {-0.423737869438983838499268586020, 0.905784862979786553616179389792}, + {-0.424432473022717471344833484181, 0.905459593711293253548433312972}, + {-0.425126826923762524135241847034, 0.905133791784249575052001546283}, + {-0.425820930733648017607606561796, 0.904807457390316649536998738768}, + {-0.426514784044051409317432899115, 0.904480590721468247217273983551}, + {-0.427208386446796262170266800240, 0.904153191969991776311132980481}, + {-0.427901737533854131800836739785, 0.903825261328487394862918336003}, + {-0.428594836897344511061902494475, 0.903496798989868454832219413220}, + {-0.429287684129534385935045293081, 0.903167805147360835960057556804}, + {-0.429980278822840455976717066733, 0.902838279994502834746583630476}, + {-0.430672620569826747338737504833, 0.902508223725145941607195254619}, + {-0.431364708963206333613982224051, 0.902177636533453619627209718601}, + {-0.432056543595841557880987693352, 0.901846518613901748651073830843}, + {-0.432748124060743866170497540224, 0.901514870161278625282363918814}, + {-0.433439449951073862976613781939, 0.901182691370684629816878441488}, + {-0.434130520860143198635938688312, 0.900849982437531449086520751734}, + {-0.434821336381412237859223068881, 0.900516743557543630771533571533}, + {-0.435511896108492058132810598181, 0.900182974926756807043659591727}, + {-0.436202199635144061140579196945, 0.899848676741518582744561172149}, + {-0.436892246555280139297394725872, 0.899513849198488091296610491554}, + {-0.437582036462964230061345460854, 0.899178492494635328569074772531}, + {-0.438271568952410373043448998942, 0.898842606827242374123443369172}, + {-0.438960843617984319831037964832, 0.898506192393901947923495754367}, + {-0.439649860054203533987760010859, 0.898169249392518076469116294902}, + {-0.440338617855737357587031510775, 0.897831778021305537684781938879}, + {-0.441027116617407011212037559744, 0.897493778478790416031074528291}, + {-0.441715355934187203779117680824, 0.897155250963808548192446323810}, + {-0.442403335401204023114019037166, 0.896816195675507299434059405030}, + {-0.443091054613736878842189526040, 0.896476612813344120311853657768}, + {-0.443778513167218335855324085060, 0.896136502577086768717151699093}, + {-0.444465710657233781244457304638, 0.895795865166813642943566264876}, + {-0.445152646679523478212558984524, 0.895454700782912449419370659598}, + {-0.445839320829980234606182420976, 0.895113009626081757019733231573}, + {-0.446525732704651290294606269526, 0.894770791897329553776785360242}, + {-0.447211881899738372680985776242, 0.894428047797973801991133768752}, + {-0.447897768011597419146596621431, 0.894084777529641883120348211378}, + {-0.448583390636739021140044769709, 0.893740981294271152890473786101}, + {-0.449268749371829811956047251442, 0.893396659294107720050703846937}, + {-0.449953843813690468333987837468, 0.893051811731707445574102166574}, + {-0.450638673559297653348210133117, 0.892706438809935276523788161285}, + {-0.451323238205783627829958959410, 0.892360540731965357075239353435}, + {-0.452007537350436250367380353055, 0.892014117701280584427081521426}, + {-0.452691570590700753662360966700, 0.891667169921672386756483774661}, + {-0.453375337524177635106781281138, 0.891319697597241500375275791157}, + {-0.454058837748624433139355005551, 0.890971700932396859506923192384}, + {-0.454742070861955505201024152484, 0.890623180131855929353434930817}, + {-0.455425036462242527335320119164, 0.890274135400644484050758364901}, + {-0.456107734147713939076851374921, 0.889924566944096828713384184084}, + {-0.456790163516757108386201480243, 0.889574474967854689211321783660}, + {-0.457472324167916000181577373951, 0.889223859677868322393123889924}, + {-0.458154215699893119229102467216, 0.888872721280395627907466860051}, + {-0.458835837711549232587060487276, 0.888521059982002259225453144609}, + {-0.459517189801903258583593014919, 0.888168875989561845685216212587}, + {-0.460198271570134154195841347246, 0.887816169510254549201988538698}, + {-0.460879082615578583581594784846, 0.887462940751568840624941003625}, + {-0.461559622537733083014188650850, 0.887109189921300167469553343835}, + {-0.462239890936253394748689515836, 0.886754917227550842895311689063}, + {-0.462919887410955244178012435441, 0.886400122878730489794918412372}, + {-0.463599611561813784721408637779, 0.886044807083555707727384742611}, + {-0.464279062988965651737061079984, 0.885688970051049073717308601772}, + {-0.464958241292706631053732735381, 0.885332611990540585544806617690}, + {-0.465637146073493657372210918766, 0.884975733111666662544791961409}, + {-0.466315776931944536709551130116, 0.884618333624369812540066959627}, + {-0.466994133468837835376774592078, 0.884260413738899297975137869798}, + {-0.467672215285114600824556418956, 0.883901973665809470581677942391}, + {-0.468350021981876474264083753951, 0.883543013615961880802274208691}, + {-0.469027553160387133956987781858, 0.883183533800523390411285618029}, + {-0.469704808422072517259948654100, 0.882823534430966616604052887851}, + {-0.470381787368520820624695488732, 0.882463015719070043019200966228}, + {-0.471058489601482333064552676660, 0.882101977876917686671731644310}, + {-0.471734914722871323533581744414, 0.881740421116898431819208781235}, + {-0.472411062334763987013985797603, 0.881378345651706918140178004251}, + {-0.473086932039400109850646458654, 0.881015751694342874600351933623}, + {-0.473762523439182958728821404293, 0.880652639458111008430307720118}, + {-0.474437836136679058629539440517, 0.880289009156621116147789507522}, + {-0.475112869734620135719893596615, 0.879924861003786973334683807479}, + {-0.475787623835901007929294337373, 0.879560195213827999971556437231}, + {-0.476462098043581194772855269548, 0.879195012001267484080813119363}, + {-0.477136291960884861840241910613, 0.878829311580933358882816719415}, + {-0.477810205191201098351427845046, 0.878463094167957758706677395821}, + {-0.478483837338083806134392261811, 0.878096359977777241034857524937}, + {-0.479157188005253198426203198323, 0.877729109226131565257844613370}, + {-0.479830256796594134538480602714, 0.877361342129065135964083310682}, + {-0.480503043316157563147328346531, 0.876993058902925892716950784234}, + {-0.481175547168160466782182993484, 0.876624259764365310054756719182}, + {-0.481847767956985806314662568184, 0.876254944930338619535348243517}, + {-0.482519705287184186293103493881, 0.875885114618103810535387765412}, + {-0.483191358763471801029965035923, 0.875514769045222851495680060907}, + {-0.483862727990732210958668702006, 0.875143908429560357653542723710}, + {-0.484533812574016176100144548400, 0.874772532989284146154318477784}, + {-0.485204612118541989129738567499, 0.874400642942864680939862864761}, + {-0.485875126229695086799154069013, 0.874028238509075738882359019044}, + {-0.486545354513030159360198467766, 0.873655319906992744449780730065}, + {-0.487215296574268708074129108354, 0.873281887355994212995824454993}, + {-0.487884952019301099124248821681, 0.872907941075760973603792081121}, + {-0.488554320454186286060149768673, 0.872533481286276058064288463356}, + {-0.489223401485151754286562209018, 0.872158508207824589852918961697}, + {-0.489892194718595019864437745127, 0.871783022060993229018777128658}, + {-0.490560699761081964176412384404, 0.871407023066670949340561946883}, + {-0.491228916219348221705587320685, 0.871030511446048372192763054045}, + {-0.491896843700299346568982628014, 0.870653487420617433478753355303}, + {-0.492564481811010757006386029389, 0.870275951212171827719998873363}, + {-0.493231830158727735380352896755, 0.869897903042806452944546435901}, + {-0.493898888350867315555348113776, 0.869519343134916966597813825501}, + {-0.494565655995015895918243131746, 0.869140271711200562698707017262}, + {-0.495232132698931237779760294870, 0.868760688994655305705805403704}, + {-0.495898318070542298841019146494, 0.868380595208579797450454407226}, + {-0.496564211717949011148931504067, 0.867999990576573621225975330162}, + {-0.497229813249424057453040859400, 0.867618875322536342586943192146}, + {-0.497895122273410817292926822120, 0.867237249670668397527606430231}, + {-0.498560138398525087843893288664, 0.866855113845470426348072123801}, + {-0.499224861233555083916968442281, 0.866472468071742940587398607022}, + {-0.499889290387461493470055984290, 0.866089312574586767112805318902}, + {-0.500553425469377311074481440301, 0.865705647579402381985858028202}, + {-0.501217266088609836316436485504, 0.865321473311889910462468833430}, + {-0.501880811854638286817476000579, 0.864936789998049015970593700331}, + {-0.502544062377115796635962396977, 0.864551597864179344199442311947}, + {-0.503207017265869138711309460632, 0.864165897136879190831848518428}, + {-0.503869676130898724863982351962, 0.863779688043046833811899887223}, + {-0.504532038582380049085429618572, 0.863392970809878534943493377796}, + {-0.505194104230662133225848720031, 0.863005745664870316247174741875}, + {-0.505855872686268748239513115550, 0.862618012835816849737113898300}, + {-0.506517343559898636229377189011, 0.862229772550811235376500007987}, + {-0.507178516462425288402471323934, 0.861841025038245334144448861480}, + {-0.507839391004897611203716678574, 0.861451770526809434969095491397}, + {-0.508499966798540703472042423527, 0.861062009245491588593779397343}, + {-0.509160243454754635195058654062, 0.860671741423578384733161783515}, + {-0.509820220585115446709778552759, 0.860280967290654507984015708644}, + {-0.510479897801375814836433164601, 0.859889687076602182713713773410}, + {-0.511139274715464164700051696855, 0.859497901011601839194042895542}, + {-0.511798350939486779154208306863, 0.859105609326130559288969834597}, + {-0.512457126085725689357275314251, 0.858712812250963630766875667177}, + {-0.513115599766640451129262601171, 0.858319510017173548099833624292}, + {-0.513773771594868144951817612309, 0.857925702856129790419004166324}, + {-0.514431641183223042901317967335, 0.857531390999499043559239908063}, + {-0.515089208144697052738081310963, 0.857136574679244978014480693673}, + {-0.515746472092461272218599788175, 0.856741254127627582803938821598}, + {-0.516403432639863879671793256421, 0.856345429577203720583611357142}, + {-0.517060089400432021378151148383, 0.855949101260826905601675207436}, + {-0.517716441987871145435917696886, 0.855552269411646859609277271375}, + {-0.518372490016065889939511635021, 0.855154934263109844927441827167}, + {-0.519028233099080638091038508719, 0.854757096048957221157138519629}, + {-0.519683670851158407977266051603, 0.854358755003227443580726685468}, + {-0.520338802886721851770346347621, 0.853959911360254175782813490514}, + {-0.520993628820373921861630606145, 0.853560565354666844761766242300}, + {-0.521648148266897204727854386874, 0.853160717221390418885107465030}, + {-0.522302360841254476042649912415, 0.852760367195645407889514899580}, + {-0.522956266158590032944175618468, 0.852359515512947085724704265886}, + {-0.523609863834227917678276753577, 0.851958162409106378731848963071}, + {-0.524263153483673360888417391834, 0.851556308120228977465160369320}, + {-0.524916134722613003660285357910, 0.851153952882715336691887841880}, + {-0.525568807166914342410279914475, 0.850751096933260897436923642090}, + {-0.526221170432627838309258549998, 0.850347740508855087782080772740}, + {-0.526873224135984585814185265917, 0.849943883846782322066815140715}, + {-0.527524967893398089024969976890, 0.849539527184620890665200931835}, + {-0.528176401321464483729073435825, 0.849134670760243626119745385949}, + {-0.528827524036961982289994921302, 0.848729314811817014962969096814}, + {-0.529478335656851761825691937702, 0.848323459577801752828918324667}, + {-0.530128835798278741364697452809, 0.847917105296951523207837908558}, + {-0.530779024078570138556187885115, 0.847510252208314440736103279050}, + {-0.531428900115236801937612654001, 0.847102900551231496883985983004}, + {-0.532078463525973544001601567288, 0.846695050565337337111770921183}, + {-0.532727713928658586084452508658, 0.846286702490559816780546498194}, + {-0.533376650941355223700668375386, 0.845877856567119112973784922360}, + {-0.534025274182310272230722603126, 0.845468513035528945742669293395}, + {-0.534673583269955399188688716094, 0.845058672136595467883068977244}, + {-0.535321577822907124222240327072, 0.844648334111417709024749456148}, + {-0.535969257459966819112651137402, 0.844237499201386909497557553550}, + {-0.536616621800120929819399862026, 0.843826167648186853398328821640}, + {-0.537263670462542419770102242182, 0.843414339693792869390165378718}, + {-0.537910403066588882481369182642, 0.843002015580472940925460534345}, + {-0.538556819231804206893343689444, 0.842589195550786707045176626707}, + {-0.539202918577918355325095944863, 0.842175879847585462378845022613}, + {-0.539848700724847363474623307411, 0.841762068714012712256078430073}, + {-0.540494165292695005753387249570, 0.841347762393502063282824110502}, + {-0.541139311901750796884869032510, 0.840932961129779776854320516577}, + {-0.541784140172491546216804181313, 0.840517665166862548709048041928}, + {-0.542428649725581357721182484966, 0.840101874749058397107148721261}, + {-0.543072840181871852038852921396, 0.839685590120966107718913917779}, + {-0.543716711162402166479523657472, 0.839268811527475344647086785699}, + {-0.544360262288400176267089136672, 0.838851539213765873270745032642}, + {-0.545003493181281051249698066385, 0.838433773425308337401418157242}, + {-0.545646403462648588167382968095, 0.838015514407863815193877599086}, + {-0.546288992754295210652060177381, 0.837596762407483041990019501100}, + {-0.546931260678201858205227381404, 0.837177517670507409519586872193}, + {-0.547573206856539651532500556641, 0.836757780443567300565632649523}, + {-0.548214830911667783119867181085, 0.836337550973583643276754173712}, + {-0.548856132466135182568223171984, 0.835916829507766356854858713632}, + {-0.549497111142680960682582735899, 0.835495616293615350755885629042}, + {-0.550137766564233743338263593614, 0.835073911578919303444479282916}, + {-0.550778098353912004547794367681, 0.834651715611756439550106279057}, + {-0.551418106135025842817753982672, 0.834229028640493530666333299450}, + {-0.552057789531074871725024877378, 0.833805850913786450462339416845}, + {-0.552697148165749774229027480033, 0.833382182680579730593706244690}, + {-0.553336181662932413694022670825, 0.832958024190106671724720399652}, + {-0.553974889646695278777599469322, 0.832533375691888899439163651550}, + {-0.554613271741303925921329209814, 0.832108237435735698106498148263}, + {-0.555251327571213981748599053390, 0.831682609671745121104891040886}, + {-0.555889056761073807599871088314, 0.831256492650303213665097246121}, + {-0.556526458935723722376565092418, 0.830829886622083568781249596213}, + {-0.557163533720196446630268383160, 0.830402791838047438233161301468}, + {-0.557800280739716880518130892597, 0.829975208549443954630930875283}, + {-0.558436699619703880159704567632, 0.829547137007808910169615046470}, + {-0.559072789985768481280103969766, 0.829118577464965977874555846938}, + {-0.559708551463714787388425975223, 0.828689530173025712400658449042}, + {-0.560343983679540857956169475074, 0.828259995384385550032391165587}, + {-0.560979086259437931261118137627, 0.827829973351730030728390374861}, + {-0.561613858829792200744179808680, 0.827399464328029465853830970445}, + {-0.562248301017183038652547111269, 0.826968468566541603514963298949}, + {-0.562882412448384439329629458371, 0.826536986320809963224576222274}, + {-0.563516192750364908192750590388, 0.826105017844664613058114355226}, + {-0.564149641550287794800055962696, 0.825672563392221392497560827906}, + {-0.564782758475511292850512745645, 0.825239623217882245498344673251}, + {-0.565415543153589550406934449711, 0.824806197576334443333223589434}, + {-0.566047995212271448650653837831, 0.824372286722551250726098714949}, + {-0.566680114279501601082245088037, 0.823937890911791370740502316039}, + {-0.567311899983420797610733643523, 0.823503010399598389668085474113}, + {-0.567943351952365338419781437551, 0.823067645441801887251642710908}, + {-0.568574469814869032369131218729, 0.822631796294515105216760275653}, + {-0.569205253199661087570859763218, 0.822195463214137278740167857904}, + {-0.569835701735667998768519737496, 0.821758646457351749070596724778}, + {-0.570465815052012992225627385778, 0.821321346281126740684896958555}, + {-0.571095592778016802881779767631, 0.820883562942714584131920219079}, + {-0.571725034543197008218839982874, 0.820445296699652160121729593811}, + {-0.572354139977269804617776571831, 0.820006547809759789302574972680}, + {-0.572982908710148564068731502630, 0.819567316531142342483917673235}, + {-0.573611340371944611327137408807, 0.819127603122188241435708278004}, + {-0.574239434592967890047532364406, 0.818687407841569569910689097014}, + {-0.574867191003726407672047571396, 0.818246730948242184666696630302}, + {-0.575494609234928011787246759923, 0.817805572701444383199032017728}, + {-0.576121688917478280700379400514, 0.817363933360698458052695514198}, + {-0.576748429682482410818522566842, 0.816921813185809475577059401985}, + {-0.577374831161244883581673548179, 0.816479212436865386948170453252}, + {-0.578000892985270020574262161972, 0.816036131374236695101842542499}, + {-0.578626614786261206369033516239, 0.815592570258576898822866496630}, + {-0.579251996196123442040004647424, 0.815148529350820938432775619731}, + {-0.579877036846960236537995569961, 0.814704008912187083168987555837}, + {-0.580501736371076604292795764195, 0.814259009204175265850267351198}, + {-0.581126094400977621923232163681, 0.813813530488567193899029916793}, + {-0.581750110569369427437891317823, 0.813367573027426793430549878394}, + {-0.582373784509159997391236629483, 0.812921137083098876985332026379}, + {-0.582997115853457703593676342280, 0.812474222918210586819043328433}, + {-0.583620104235572645379193090776, 0.812026830795669729567975991813}, + {-0.584242749289016982672251288022, 0.811578960978665886472072088509}, + {-0.584865050647504602920889738016, 0.811130613730669081107294005051}, + {-0.585487007944951232119024098211, 0.810681789315430778586346605152}, + {-0.586108620815476211163286279771, 0.810232487996982442268745217007}, + {-0.586729888893400386429277659772, 0.809782710039636532961537795927}, + {-0.587350811813247664083803556423, 0.809332455707985842785490149254}, + {-0.587971389209745121107175691577, 0.808881725266903606197388398868}, + {-0.588591620717822672226304803189, 0.808430518981542944878526668617}, + {-0.589211505972614846271540045564, 0.807978837117336423645497234247}, + {-0.589831044609458787775224664074, 0.807526679939997160673215148563}, + {-0.590450236263895811283930470381, 0.807074047715517606249591153755}, + {-0.591069080571671401358457842434, 0.806620940710169653797834143916}, + {-0.591687577168735545640743112017, 0.806167359190504306809543777490}, + {-0.592305725691242179742346252169, 0.805713303423352233956222789857}, + {-0.592923525775551185645895202470, 0.805258773675822325799344980624}, + {-0.593540977058226282281339081237, 0.804803770215302916035682301299}, + {-0.594158079176036801882787585782, 0.804348293309460782296582692652}, + {-0.594774831765957578966208529891, 0.803892343226241257170272547228}, + {-0.595391234465168395217915531248, 0.803435920233868339224159171863}, + {-0.596007286911056421985222186777, 0.802979024600843360737201237498}, + {-0.596622988741213222674275584723, 0.802521656595946430989840791881}, + {-0.597238339593437417285315405024, 0.802063816488235548085583559441}, + {-0.597853339105733905256556681707, 0.801605504547046043839486628713}, + {-0.598467986916314420575702115457, 0.801146721041991249911973227427}, + {-0.599082282663597087690732223564, 0.800687466242961720652715484903}, + {-0.599696225986208197866744740168, 0.800227740420124900033727044502}, + {-0.600309816522980321806812753493, 0.799767543843925787783177838719}, + {-0.600923053912954086008824106102, 0.799306876785086162229276851576}, + {-0.601535937795377728676271544828, 0.798845739514604580300272118620}, + {-0.602148467809706988695950258261, 0.798384132303756599569055651955}, + {-0.602760643595607104039402202034, 0.797922055424093112918626502506}, + {-0.603372464792950258249959460954, 0.797459509147442568988140010333}, + {-0.603983931041818022933398424357, 0.796996493745908862749161016836}, + {-0.604595041982500358557217623456, 0.796533009491872001639478639845}, + {-0.605205797255496613651359893993, 0.796069056657987883518501348590}, + {-0.605816196501514747652095138619, 0.795604635517188296667256963701}, + {-0.606426239361473440325767114700, 0.795139746342679698543065569538}, + {-0.607035925476499649278139258968, 0.794674389407944659069471526891}, + {-0.607645254487930830400443937833, 0.794208564986740639390916385310}, + {-0.608254226037314493780172597326, 0.793742273353100102895041345619}, + {-0.608862839766407981656470838061, 0.793275514781330848279594647465}, + {-0.609471095317180133754675352975, 0.792808289546014233195592169068}, + {-0.610078992331809621951776989590, 0.792340597922007172648761752498}, + {-0.610686530452686171521747837687, 0.791872440184440584687308728462}, + {-0.611293709322411005224751079368, 0.791403816608719501424218378816}, + {-0.611900528583796177173326213961, 0.790934727470523291081860861595}, + {-0.612506987879865349988506295631, 0.790465173045805102880478898442}, + {-0.613113086853854794000540096022, 0.789995153610791200904372999503}, + {-0.613718825149211721914355166518, 0.789524669441982185347228551109}, + {-0.614324202409595954144094775984, 0.789053720816151882289091190614}, + {-0.614929218278879585746210523212, 0.788582308010347121651761881367}, + {-0.615533872401147097441764799441, 0.788110431301888292310309225286}, + {-0.616138164420696798906362801063, 0.787638090968367565736230062612}, + {-0.616742093982038719346405741817, 0.787165287287651005421196259704}, + {-0.617345660729896827945140103111, 0.786692020537876790520215308788}, + {-0.617948864309208256706540396408, 0.786218290997455548918537715508}, + {-0.618551704365123855566821475804, 0.785744098945070246209354536404}, + {-0.619154180543008192394438538031, 0.785269444659676074671494916402}, + {-0.619756292488440552190809285094, 0.784794328420499343046401463653}, + {-0.620358039847213715844986836601, 0.784318750507038919828062262241}, + {-0.620959422265335181378986817435, 0.783842711199065234062288709538}, + {-0.621560439389027274970089820272, 0.783366210776619720235203203629}, + {-0.622161090864726595839329092996, 0.782889249520015706451658843434}, + {-0.622761376339086236697539789020, 0.782411827709836638078400028462}, + {-0.623361295458973230232402329420, 0.781933945626937632056296934024}, + {-0.623960847871470658532189190737, 0.781455603552444588721925811114}, + {-0.624560033223877320018857517425, 0.780976801767753747718359136343}, + {-0.625158851163707729448049121856, 0.780497540554531799017468074453}, + {-0.625757301338692673020602796896, 0.780017820194716215986829865869}, + {-0.626355383396779874516369090998, 0.779537640970513368010585963930}, + {-0.626953096986132663026580758014, 0.779057003164400629913188822684}, + {-0.627550441755131527266087232420, 0.778575907059124938669469884189}, + {-0.628147417352374115573354629305, 0.778094352937702793404639578512}, + {-0.628744023426674458754348506773, 0.777612341083420144371984861209}, + {-0.629340259627065523595490503794, 0.777129871779831726819054438238}, + {-0.629936125602796437306096777320, 0.776646945310762060188380928594}, + {-0.630531621003334596942124790075, 0.776163561960304337894456239155}, + {-0.631126745478365336339265923016, 0.775679722012820649368336489715}, + {-0.631721498677792370202155325387, 0.775195425752941313923827237886}, + {-0.632315880251737461037464527180, 0.774710673465565768935903179226}, + {-0.632909889850541640399228526803, 0.774225465435860793483868746989}, + {-0.633503527124764320710426090955, 0.773739801949261951641290124826}, + {-0.634096791725183739352189604688, 0.773253683291472593275273084146}, + {-0.634689683302797735819922309020, 0.772767109748463743024160521600}, + {-0.635282201508823196611785988352, 0.772280081606474544386742309143}, + {-0.635874345994697498518632983178, 0.771792599152010261320810968755}, + {-0.636466116412077065334074177372, 0.771304662671844831756118310295}, + {-0.637057512412838478077503623354, 0.770816272453018536126023718680}, + {-0.637648533649078808061005929630, 0.770327428782838774523611391487}, + {-0.638239179773115394844751335768, 0.769838131948879844657085413928}, + {-0.638829450437486068281600637420, 0.769348382238982497760559908784}, + {-0.639419345294950480784734736517, 0.768858179941253383482546723826}, + {-0.640008863998488441993117703532, 0.768367525344066271131282519491}, + {-0.640598006201301028994521402637, 0.767876418736060606384796756174}, + {-0.641186771556811252459340266796, 0.767384860406141622313214156748}, + {-0.641775159718663279484474060155, 0.766892850643480894490267019137}, + {-0.642363170340724098927864815778, 0.766400389737514342591850891040}, + {-0.642950803077081967096262360428, 0.765907477977944339819771357725}, + {-0.643538057582047740012853864755, 0.765414115654738269611812029325}, + {-0.644124933510154540350356455747, 0.764920303058128414619432078325}, + {-0.644711430516158423564831991825, 0.764426040478611956707766239560}, + {-0.645297548255038155851082137815, 0.763931328206951310022532197763}, + {-0.645883286381996213343370527582, 0.763436166534172122588586262282}, + {-0.646468644552457782914700601395, 0.762940555751565718800577542424}, + {-0.647053622422071650355235306051, 0.762444496150687101021503622178}, + {-0.647638219646710311394599557389, 0.761947988023355393671920410270}, + {-0.648222435882470193746485165320, 0.761451031661653732207639677654}, + {-0.648806270785672434264768071444, 0.760953627357928263919006894866}, + {-0.649389724012861657698181261367, 0.760455775404789258153925857187}, + {-0.649972795220807419980246777413, 0.759957476095110440184043909539}, + {-0.650555484066503986184670793591, 0.759458729722028214048634708888}, + {-0.651137790207170441547646078106, 0.758959536578942328688412999327}, + {-0.651719713300250802490154455882, 0.758459896959515544878627224534}, + {-0.652301253003415237863293896226, 0.757959811157672413983732440101}, + {-0.652882408974558847702951425163, 0.757459279467600721247322326235}, + {-0.653463180871802329363617900526, 0.756958302183750486591407025116}, + {-0.654043568353492643652202787052, 0.756456879600833631549505753355}, + {-0.654623571078202459716521843802, 0.755955012013824534378159114567}, + {-0.655203188704731709357531599380, 0.755452699717958364722392161639}, + {-0.655782420892106032717094876716, 0.754949943008732748950251334463}, + {-0.656361267299577888501005418220, 0.754446742181906437885174909752}, + {-0.656939727586627109090500198363, 0.753943097533499639872900388582}, + {-0.657517801412960234408444648579, 0.753439009359793465669952183816}, + {-0.658095488438510956008542507334, 0.752934477957330372532851470169}, + {-0.658672788323441782409872757853, 0.752429503622912498883579246467}, + {-0.659249700728141374561630527751, 0.751924086653603551688718198420}, + {-0.659826225313227432422991114436, 0.751418227346727363169520685915}, + {-0.660402361739545029628573047376, 0.750911925999867890801908743015}, + {-0.660978109668167834733765175770, 0.750405182910869439361079002992}, + {-0.661553468760398777348541443644, 0.749897998377835439676175610657}, + {-0.662128438677768604847528877144, 0.749390372699129558853314847511}, + {-0.662703019082037325659939597244, 0.748882306173375145164072819171}, + {-0.663277209635194098247268357227, 0.748373799099454561911670680274}, + {-0.663851009999457453147897467716, 0.747864851776509298453277096996}, + {-0.664424419837274959910189409129, 0.747355464503940414289218097110}, + {-0.664997438811325225493931156961, 0.746845637581406651683835207223}, + {-0.665570066584515451779680006439, 0.746335371308826323044627315539}, + {-0.666142302819983544992510360316, 0.745824665986375978654621121677}, + {-0.666714147181097671612803878816, 0.745313521914490406672371136665}, + {-0.667285599331456147353947017109, 0.744801939393862855176564607973}, + {-0.667856658934889213519170425570, 0.744289918725443366831484581780}, + {-0.668427325655456705533197236946, 0.743777460210440888310756690771}, + {-0.668997599157450273388292316668, 0.743264564150321604962812216399}, + {-0.669567479105392493465842562728, 0.742751230846809051833190551406}, + {-0.670136965164037867737079068320, 0.742237460601883891619934274786}, + {-0.670706056998371935584657421714, 0.741723253717784358762799001852}, + {-0.671274754273613383226404494053, 0.741208610497004372064111521468}, + {-0.671843056655211934291571651556, 0.740693531242295755134819046361}, + {-0.672410963808849904133069230738, 0.740178016256666237993044887844}, + {-0.672978475400442088805164075893, 0.739662065843380012175600768387}, + {-0.673545591096135876085782001610, 0.739145680305957619715684359107}, + {-0.674112310562312244677229955414, 0.738628859948175064964459579642}, + {-0.674678633465584431938566467579, 0.738111605074064369702568910725}, + {-0.675244559472799266153231201315, 0.737593915987913573140133394190}, + {-0.675810088251037055506742490252, 0.737075792994265621693728007813}, + {-0.676375219467611699108999800956, 0.736557236397919035120196440403}, + {-0.676939952790071020061191120476, 0.736038246503927573449743704259}, + {-0.677504287886197320567305268924, 0.735518823617599015740609047498}, + {-0.678068224424006493755712199345, 0.734998968044496714391300429270}, + {-0.678631762071749355946792547911, 0.734478680090438373895267432090}, + {-0.679194900497911202563727783854, 0.733957960061495939818598799320}, + {-0.679757639371211808132500209467, 0.733436808263995931866929822718}, + {-0.680319978360607091616429897840, 0.732915225004517889573207867215}, + {-0.680881917135287118014730367577, 0.732393210589896148654531771172}, + {-0.681443455364677874719347983046, 0.731870765327218286699917371152}, + {-0.682004592718440827425752104318, 0.731347889523825456237204889476}, + {-0.682565328866473364222144937230, 0.730824583487312051666151546669}, + {-0.683125663478908462522554145835, 0.730300847525525598236129098950}, + {-0.683685596226116465423672252655, 0.729776681946566196934611525649}, + {-0.684245126778702972281109850883, 0.729252087058786968576384879270}, + {-0.684804254807510615066235004633, 0.728727063170793831758942360466}, + {-0.685362979983618725299265861395, 0.728201610591444503661762155389}, + {-0.685921301978343334049270652031, 0.727675729629849832313936985884}, + {-0.686479220463238726246402165998, 0.727149420595371132058915009111}, + {-0.687036735110095553302755888581, 0.726622683797622959112061380438}, + {-0.687593845590942165379999551078, 0.726095519546471002136911465641}, + {-0.688150551578044833433978055837, 0.725567928152032304289775765938}, + {-0.688706852743907860237015938765, 0.725039909924675263219739917986}, + {-0.689262748761273247311009981786, 0.724511465175019742090967156400}, + {-0.689818239303122360261966150574, 0.723982594213935737315068763564}, + {-0.690373324042674041400857731787, 0.723453297352544377751826232270}, + {-0.690928002653386275078162270802, 0.722923574902217702664586340688}, + {-0.691482274808955854616954184166, 0.722393427174577551497236527211}, + {-0.692036140183318493335207222117, 0.721862854481496563074927053094}, + {-0.692589598450650156813424018765, 0.721331857135096399247231602203}, + {-0.693142649285365286537796691846, 0.720800435447749410222684218752}, + {-0.693695292362118243190138855425, 0.720268589732077191278847294598}, + {-0.694247527355803306647885619896, 0.719736320300951026851521419303}, + {-0.694799353941555009051000979525, 0.719203627467491113378628142527}, + {-0.695350771794747579690465499880, 0.718670511545067447478629674151}, + {-0.695901780590996610342813255556, 0.718136972847297716526782096480}, + {-0.696452380006157834024804742512, 0.717603011688049186034277227009}, + {-0.697002569716327458060334265610, 0.717068628381437478402915530751}, + {-0.697552349397843274303454563778, 0.716533823241826572925106120238}, + {-0.698101718727283659937654647365, 0.715998596583828916806169218034}, + {-0.698650677381469353832699198392, 0.715462948722303870852101681521}, + {-0.699199225037461902232394095336, 0.714926879972359596848718865658}, + {-0.699747361372564879999913500797, 0.714390390649351503249420147768}, + {-0.700295086064323779595497398986, 0.713853481068882467219793852564}, + {-0.700842398790526233121056520758, 0.713316151546802501570709864609}, + {-0.701389299229202012320172343607, 0.712778402399209198847529478371}, + {-0.701935787058624249823424179340, 0.712240233942445621906358610431}, + {-0.702481861957307884836154698860, 0.711701646493102968449306899856}, + {-0.703027523604011217450704407383, 0.711162640368018350578438457887}, + {-0.703572771677735575579504256893, 0.710623215884275016840376792970}, + {-0.704117605857725203932773183624, 0.710083373359202907337817123334}, + {-0.704662025823468707308450120763, 0.709543113110376877372686976742}, + {-0.705206031254697718324564448267, 0.709002435455618362780683128221}, + {-0.705749621831387785597655692982, 0.708461340712994158685944512399}, + {-0.706292797233758484765075991163, 0.707919829200816308478749760980}, + {-0.706835557142273862574199938535, 0.707377901237641992793214740232}, + {-0.707377901237641881770912277716, 0.706835557142273973596502401051}, + {-0.707919829200816197456447298464, 0.706292797233758595787378453679}, + {-0.708461340712994047663642049883, 0.705749621831387896619958155497}, + {-0.709002435455618251758380665706, 0.705206031254697829346866910782}, + {-0.709543113110376766350384514226, 0.704662025823468818330752583279}, + {-0.710083373359202796315514660819, 0.704117605857725314955075646139}, + {-0.710623215884274905818074330455, 0.703572771677735686601806719409}, + {-0.711162640368018239556135995372, 0.703027523604011439495309332415}, + {-0.711701646493102857427004437341, 0.702481861957308106880759623891}, + {-0.712240233942445510884056147916, 0.701935787058624360845726641855}, + {-0.712778402399208976802924553340, 0.701389299229202123342474806122}, + {-0.713316151546802390548407402093, 0.700842398790526455165661445790}, + {-0.713853481068882356197491390049, 0.700295086064324001640102324018}, + {-0.714390390649351392227117685252, 0.699747361372565102044518425828}, + {-0.714926879972359485826416403143, 0.699199225037462124276999020367}, + {-0.715462948722303759829799219006, 0.698650677381469464855001660908}, + {-0.715998596583828805783866755519, 0.698101718727283770959957109881}, + {-0.716533823241826461902803657722, 0.697552349397843385325757026294}, + {-0.717068628381437367380613068235, 0.697002569716327569082636728126}, + {-0.717603011688048963989672301977, 0.696452380006157945047107205028}, + {-0.718136972847297494482177171449, 0.695901780590996832387418180588}, + {-0.718670511545067336456327211636, 0.695350771794747690712767962395}, + {-0.719203627467491002356325680012, 0.694799353941555120073303442041}, + {-0.719736320300950804806916494272, 0.694247527355803417670188082411}, + {-0.720268589732077080256544832082, 0.693695292362118354212441317941}, + {-0.720800435447749188178079293721, 0.693142649285365397560099154362}, + {-0.721331857135096288224929139687, 0.692589598450650378858028943796}, + {-0.721862854481496452052624590578, 0.692036140183318715379812147148}, + {-0.722393427174577440474934064696, 0.691482274808955965639256646682}, + {-0.722923574902217591642283878173, 0.690928002653386386100464733317}, + {-0.723453297352544266729523769754, 0.690373324042674152423160194303}, + {-0.723982594213935515270463838533, 0.689818239303122471284268613090}, + {-0.724511465175019631068664693885, 0.689262748761273358333312444302}, + {-0.725039909924675152197437455470, 0.688706852743907971259318401280}, + {-0.725567928152032082245170840906, 0.688150551578044944456280518352}, + {-0.726095519546470891114609003125, 0.687593845590942276402302013594}, + {-0.726622683797622848089758917922, 0.687036735110095664325058351096}, + {-0.727149420595371021036612546595, 0.686479220463238948291007091029}, + {-0.727675729629849721291634523368, 0.685921301978343556093875577062}, + {-0.728201610591444392639459692873, 0.685362979983618836321568323910}, + {-0.728727063170793609714337435435, 0.684804254807510726088537467149}, + {-0.729252087058786857554082416755, 0.684245126778703083303412313398}, + {-0.729776681946566085912309063133, 0.683685596226116576445974715170}, + {-0.730300847525525487213826636435, 0.683125663478908684567159070866}, + {-0.730824583487311829621546621638, 0.682565328866473475244447399746}, + {-0.731347889523825345214902426960, 0.682004592718440938448054566834}, + {-0.731870765327218175677614908636, 0.681443455364677985741650445561}, + {-0.732393210589896037632229308656, 0.680881917135287229037032830092}, + {-0.732915225004517778550905404700, 0.680319978360607202638732360356}, + {-0.733436808263995820844627360202, 0.679757639371211919154802671983}, + {-0.733957960061495828796296336805, 0.679194900497911313586030246370}, + {-0.734478680090438262872964969574, 0.678631762071749577991397472942}, + {-0.734998968044496603368997966754, 0.678068224424006715800317124376}, + {-0.735518823617598904718306584982, 0.677504287886197431589607731439}, + {-0.736038246503927462427441241744, 0.676939952790071131083493582992}, + {-0.736557236397918924097893977887, 0.676375219467611921153604725987}, + {-0.737075792994265510671425545297, 0.675810088251037166529044952767}, + {-0.737593915987913462117830931675, 0.675244559472799377175533663831}, + {-0.738111605074064258680266448209, 0.674678633465584542960868930095}, + {-0.738628859948174842919854654610, 0.674112310562312355699532417930}, + {-0.739145680305957508693381896592, 0.673545591096135987108084464126}, + {-0.739662065843379790130995843356, 0.672978475400442199827466538409}, + {-0.740178016256666126970742425328, 0.672410963808850015155371693254}, + {-0.740693531242295644112516583846, 0.671843056655212045313874114072}, + {-0.741208610497004261041809058952, 0.671274754273613494248706956569}, + {-0.741723253717784247740496539336, 0.670706056998372046606959884230}, + {-0.742237460601883780597631812270, 0.670136965164037978759381530836}, + {-0.742751230846808940810888088890, 0.669567479105392604488145025243}, + {-0.743264564150321493940509753884, 0.668997599157450384410594779183}, + {-0.743777460210440777288454228255, 0.668427325655456927577802161977}, + {-0.744289918725443255809182119265, 0.667856658934889324541472888086}, + {-0.744801939393862744154262145457, 0.667285599331456369398551942140}, + {-0.745313521914490295650068674149, 0.666714147181097782635106341331}, + {-0.745824665986375867632318659162, 0.666142302819983656014812822832}, + {-0.746335371308826212022324853024, 0.665570066584515562801982468955}, + {-0.746845637581406540661532744707, 0.664997438811325336516233619477}, + {-0.747355464503940303266915634595, 0.664424419837275070932491871645}, + {-0.747864851776509187430974634481, 0.663851009999457564170199930231}, + {-0.748373799099454450889368217759, 0.663277209635194320291873282258}, + {-0.748882306173375034141770356655, 0.662703019082037547704544522276}, + {-0.749390372699129447831012384995, 0.662128438677768715869831339660}, + {-0.749897998377835328653873148141, 0.661553468760398888370843906159}, + {-0.750405182910869328338776540477, 0.660978109668167945756067638285}, + {-0.750911925999867779779606280499, 0.660402361739545140650875509891}, + {-0.751418227346727252147218223399, 0.659826225313227543445293576951}, + {-0.751924086653603440666415735905, 0.659249700728141596606235452782}, + {-0.752429503622912387861276783951, 0.658672788323441893432175220369}, + {-0.752934477957330261510549007653, 0.658095488438511178053147432365}, + {-0.753439009359793354647649721301, 0.657517801412960345430747111095}, + {-0.753943097533499528850597926066, 0.656939727586627220112802660879}, + {-0.754446742181906326862872447236, 0.656361267299578110545610343252}, + {-0.754949943008732526905646409432, 0.655782420892106143739397339232}, + {-0.755452699717958253700089699123, 0.655203188704731820379834061896}, + {-0.755955012013824423355856652051, 0.654623571078202570738824306318}, + {-0.756456879600833520527203290840, 0.654043568353492754674505249568}, + {-0.756958302183750375569104562601, 0.653463180871802440385920363042}, + {-0.757459279467600610225019863719, 0.652882408974558958725253887678}, + {-0.757959811157672302961429977586, 0.652301253003415459907898821257}, + {-0.758459896959515433856324762019, 0.651719713300250913512456918397}, + {-0.758959536578942217666110536811, 0.651137790207170552569948540622}, + {-0.759458729722028103026332246372, 0.650555484066504097206973256107}, + {-0.759957476095110329161741447024, 0.649972795220807531002549239929}, + {-0.760455775404789147131623394671, 0.649389724012861768720483723882}, + {-0.760953627357928152896704432351, 0.648806270785672545287070533959}, + {-0.761451031661653621185337215138, 0.648222435882470304768787627836}, + {-0.761947988023355282649617947754, 0.647638219646710533439204482420}, + {-0.762444496150686989999201159662, 0.647053622422071761377537768567}, + {-0.762940555751565607778275079909, 0.646468644552457893937003063911}, + {-0.763436166534172011566283799766, 0.645883286381996324365672990098}, + {-0.763931328206951199000229735248, 0.645297548255038266873384600331}, + {-0.764426040478611845685463777045, 0.644711430516158645609436916857}, + {-0.764920303058128303597129615810, 0.644124933510154651372658918262}, + {-0.765414115654738158589509566809, 0.643538057582047851035156327271}, + {-0.765907477977944228797468895209, 0.642950803077082189140867285460}, + {-0.766400389737514231569548428524, 0.642363170340724320972469740809}, + {-0.766892850643480783467964556621, 0.641775159718663390506776522670}, + {-0.767384860406141511290911694232, 0.641186771556811363481642729312}, + {-0.767876418736060495362494293659, 0.640598006201301140016823865153}, + {-0.768367525344066160108980056975, 0.640008863998488553015420166048}, + {-0.768858179941253272460244261310, 0.639419345294950702829339661548}, + {-0.769348382238982386738257446268, 0.638829450437486290326205562451}, + {-0.769838131948879622612480488897, 0.638239179773115616889356260799}, + {-0.770327428782838663501308928971, 0.637648533649078919083308392146}, + {-0.770816272453018425103721256164, 0.637057512412838589099806085869}, + {-0.771304662671844720733815847780, 0.636466116412077176356376639887}, + {-0.771792599152010150298508506239, 0.635874345994697720563237908209}, + {-0.772280081606474433364439846628, 0.635282201508823418656390913384}, + {-0.772767109748463632001858059084, 0.634689683302797957864527234051}, + {-0.773253683291472482252970621630, 0.634096791725183850374492067203}, + {-0.773739801949261840618987662310, 0.633503527124764431732728553470}, + {-0.774225465435860682461566284474, 0.632909889850541751421530989319}, + {-0.774710673465565657913600716711, 0.632315880251737572059766989696}, + {-0.775195425752941202901524775370, 0.631721498677792592246760250418}, + {-0.775679722012820427323731564684, 0.631126745478365447361568385531}, + {-0.776163561960304226872153776640, 0.630531621003334707964427252591}, + {-0.776646945310761949166078466078, 0.629936125602796548328399239836}, + {-0.777129871779831615796751975722, 0.629340259627065634617792966310}, + {-0.777612341083420033349682398693, 0.628744023426674680798953431804}, + {-0.778094352937702682382337115996, 0.628147417352374226595657091821}, + {-0.778575907059124827647167421674, 0.627550441755131749310692157451}, + {-0.779057003164400518890886360168, 0.626953096986132774048883220530}, + {-0.779537640970513256988283501414, 0.626355383396779985538671553513}, + {-0.780017820194716104964527403354, 0.625757301338692784042905259412}, + {-0.780497540554531687995165611937, 0.625158851163707951492654046888}, + {-0.780976801767753636696056673827, 0.624560033223877431041159979941}, + {-0.781455603552444477699623348599, 0.623960847871470769554491653253}, + {-0.781933945626937521033994471509, 0.623361295458973341254704791936}, + {-0.782411827709836527056097565946, 0.622761376339086347719842251536}, + {-0.782889249520015595429356380919, 0.622161090864726817883934018028}, + {-0.783366210776619609212900741113, 0.621560439389027385992392282787}, + {-0.783842711199065123039986247022, 0.620959422265335292401289279951}, + {-0.784318750507038808805759799725, 0.620358039847213826867289299116}, + {-0.784794328420499232024099001137, 0.619756292488440663213111747609}, + {-0.785269444659675963649192453886, 0.619154180543008303416741000547}, + {-0.785744098945070135187052073888, 0.618551704365124077611426400836}, + {-0.786218290997455437896235252992, 0.617948864309208367728842858924}, + {-0.786692020537876679497912846273, 0.617345660729896938967442565627}, + {-0.787165287287650894398893797188, 0.616742093982038830368708204333}, + {-0.787638090968367454713927600096, 0.616138164420696909928665263578}, + {-0.788110431301888070265704300255, 0.615533872401147319486369724473}, + {-0.788582308010347010629459418851, 0.614929218278879807790815448243}, + {-0.789053720816151771266788728099, 0.614324202409596065166397238499}, + {-0.789524669441982074324926088593, 0.613718825149211832936657629034}, + {-0.789995153610791089882070536987, 0.613113086853854905022842558537}, + {-0.790465173045804991858176435926, 0.612506987879865461010808758147}, + {-0.790934727470523180059558399080, 0.611900528583796288195628676476}, + {-0.791403816608719390401915916300, 0.611293709322411116247053541883}, + {-0.791872440184440473665006265946, 0.610686530452686393566352762718}, + {-0.792340597922007061626459289982, 0.610078992331809732974079452106}, + {-0.792808289546014122173289706552, 0.609471095317180244776977815491}, + {-0.793275514781330737257292184950, 0.608862839766408092678773300577}, + {-0.793742273353099991872738883103, 0.608254226037314604802475059842}, + {-0.794208564986740528368613922794, 0.607645254487930941422746400349}, + {-0.794674389407944548047169064375, 0.607035925476499760300441721483}, + {-0.795139746342679587520763107023, 0.606426239361473551348069577216}, + {-0.795604635517188185644954501186, 0.605816196501514969696700063650}, + {-0.796069056657987772496198886074, 0.605205797255496724673662356508}, + {-0.796533009491871890617176177329, 0.604595041982500469579520085972}, + {-0.796996493745908751726858554321, 0.603983931041818133955700886872}, + {-0.797459509147442457965837547818, 0.603372464792950369272261923470}, + {-0.797922055424093001896324039990, 0.602760643595607215061704664549}, + {-0.798384132303756488546753189439, 0.602148467809707099718252720777}, + {-0.798845739514604469277969656105, 0.601535937795377839698574007343}, + {-0.799306876785086051206974389061, 0.600923053912954308053429031133}, + {-0.799767543843925676760875376203, 0.600309816522980432829115216009}, + {-0.800227740420124789011424581986, 0.599696225986208308889047202683}, + {-0.800687466242961609630413022387, 0.599082282663597198713034686079}, + {-0.801146721041991138889670764911, 0.598467986916314531598004577972}, + {-0.801605504547045932817184166197, 0.597853339105734016278859144222}, + {-0.802063816488235437063281096925, 0.597238339593437528307617867540}, + {-0.802521656595946319967538329365, 0.596622988741213333696578047238}, + {-0.802979024600843249714898774982, 0.596007286911056533007524649292}, + {-0.803435920233868228201856709347, 0.595391234465168617262520456279}, + {-0.803892343226241146147970084712, 0.594774831765957689988510992407}, + {-0.804348293309460671274280230136, 0.594158079176037023927392510814}, + {-0.804803770215302805013379838783, 0.593540977058226393303641543753}, + {-0.805258773675822214777042518108, 0.592923525775551296668197664985}, + {-0.805713303423352122933920327341, 0.592305725691242401786951177201}, + {-0.806167359190504195787241314974, 0.591687577168735767685348037048}, + {-0.806620940710169542775531681400, 0.591069080571671623403062767466}, + {-0.807074047715517495227288691240, 0.590450236263895922306232932897}, + {-0.807526679939997049650912686047, 0.589831044609458898797527126590}, + {-0.807978837117336312623194771732, 0.589211505972614957293842508079}, + {-0.808430518981542833856224206102, 0.588591620717822783248607265705}, + {-0.808881725266903495175085936353, 0.587971389209745232129478154093}, + {-0.809332455707985731763187686738, 0.587350811813247775106106018939}, + {-0.809782710039636421939235333411, 0.586729888893400497451580122288}, + {-0.810232487996982331246442754491, 0.586108620815476433207891204802}, + {-0.810681789315430778586346605152, 0.585487007944951454163629023242}, + {-0.811130613730668970084991542535, 0.584865050647504713943192200531}, + {-0.811578960978665775449769625993, 0.584242749289017093694553750538}, + {-0.812026830795669618545673529297, 0.583620104235572756401495553291}, + {-0.812474222918210475796740865917, 0.582997115853457814615978804795}, + {-0.812921137083098765963029563864, 0.582373784509160108413539091998}, + {-0.813367573027426682408247415879, 0.581750110569369538460193780338}, + {-0.813813530488567082876727454277, 0.581126094400977843967837088712}, + {-0.814259009204175154827964888682, 0.580501736371076715315098226711}, + {-0.814704008912187083168987555837, 0.579877036846960458582600494992}, + {-0.815148529350820827410473157215, 0.579251996196123553062307109940}, + {-0.815592570258576787800564034114, 0.578626614786261428413638441270}, + {-0.816036131374236584079540079983, 0.578000892985270131596564624488}, + {-0.816479212436865275925867990736, 0.577374831161245105626278473210}, + {-0.816921813185809364554756939469, 0.576748429682482521840825029358}, + {-0.817363933360698347030393051682, 0.576121688917478391722681863030}, + {-0.817805572701444272176729555213, 0.575494609234928122809549222438}, + {-0.818246730948242073644394167786, 0.574867191003726629716652496427}, + {-0.818687407841569458888386634499, 0.574239434592968112092137289437}, + {-0.819127603122188130413405815489, 0.573611340371944722349439871323}, + {-0.819567316531142231461615210719, 0.572982908710148675091033965145}, + {-0.820006547809759678280272510165, 0.572354139977270026662381496863}, + {-0.820445296699652049099427131296, 0.571725034543197119241142445389}, + {-0.820883562942714473109617756563, 0.571095592778017024926384692662}, + {-0.821321346281126629662594496040, 0.570465815052013214270232310810}, + {-0.821758646457351638048294262262, 0.569835701735668109790822200011}, + {-0.822195463214137167717865395389, 0.569205253199661309615464688250}, + {-0.822631796294514994194457813137, 0.568574469814869143391433681245}, + {-0.823067645441801776229340248392, 0.567943351952365449442083900067}, + {-0.823503010399598278645783011598, 0.567311899983421019655338568555}, + {-0.823937890911791259718199853523, 0.566680114279501823126850013068}, + {-0.824372286722551139703796252434, 0.566047995212271559672956300346}, + {-0.824806197576334332310921126918, 0.565415543153589661429236912227}, + {-0.825239623217882134476042210736, 0.564782758475511403872815208160}, + {-0.825672563392221281475258365390, 0.564149641550287905822358425212}, + {-0.826105017844664502035811892711, 0.563516192750365019215053052903}, + {-0.826536986320809852202273759758, 0.562882412448384550351931920886}, + {-0.826968468566541492492660836433, 0.562248301017183260697152036300}, + {-0.827399464328029465853830970445, 0.561613858829792422788784733712}, + {-0.827829973351729919706087912346, 0.560979086259438042283420600143}, + {-0.828259995384385439010088703071, 0.560343983679540968978471937589}, + {-0.828689530173025601378355986526, 0.559708551463714898410728437739}, + {-0.829118577464965977874555846938, 0.559072789985768592302406432282}, + {-0.829547137007808799147312583955, 0.558436699619704102204309492663}, + {-0.829975208549443843608628412767, 0.557800280739716991540433355112}, + {-0.830402791838047327210858838953, 0.557163533720196557652570845676}, + {-0.830829886622083457758947133698, 0.556526458935723833398867554934}, + {-0.831256492650303102642794783605, 0.555889056761073918622173550830}, + {-0.831682609671745121104891040886, 0.555251327571214092770901515905}, + {-0.832108237435735587084195685748, 0.554613271741304036943631672330}, + {-0.832533375691888788416861189035, 0.553974889646695500822204394353}, + {-0.832958024190106560702417937136, 0.553336181662932524716325133340}, + {-0.833382182680579619571403782174, 0.552697148165749996273632405064}, + {-0.833805850913786339440036954329, 0.552057789531075093769629802409}, + {-0.834229028640493419644030836935, 0.551418106135026064862358907703}, + {-0.834651715611756439550106279057, 0.550778098353912115570096830197}, + {-0.835073911578919192422176820401, 0.550137766564233854360566056130}, + {-0.835495616293615239733583166526, 0.549497111142681071704885198415}, + {-0.835916829507766356854858713632, 0.548856132466135404612828097015}, + {-0.836337550973583532254451711196, 0.548214830911667894142169643601}, + {-0.836757780443567189543330187007, 0.547573206856539762554803019157}, + {-0.837177517670507298497284409677, 0.546931260678202080249832306436}, + {-0.837596762407482930967717038584, 0.546288992754295432696665102412}, + {-0.838015514407863704171575136570, 0.545646403462648699189685430611}, + {-0.838433773425308226379115694726, 0.545003493181281162272000528901}, + {-0.838851539213765762248442570126, 0.544360262288400398311694061704}, + {-0.839268811527475233624784323183, 0.543716711162402277501826119988}, + {-0.839685590120965996696611455263, 0.543072840181872074083457846427}, + {-0.840101874749058286084846258746, 0.542428649725581468743484947481}, + {-0.840517665166862437686745579413, 0.541784140172491657239106643829}, + {-0.840932961129779665832018054061, 0.541139311901750907907171495026}, + {-0.841347762393501952260521647986, 0.540494165292695227797992174601}, + {-0.841762068714012601233775967557, 0.539848700724847474496925769927}, + {-0.842175879847585462378845022613, 0.539202918577918466347398407379}, + {-0.842589195550786596022874164191, 0.538556819231804317915646151960}, + {-0.843002015580472829903158071829, 0.537910403066588993503671645158}, + {-0.843414339693792758367862916202, 0.537263670462542530792404704698}, + {-0.843826167648186742376026359125, 0.536616621800121040841702324542}, + {-0.844237499201386798475255091034, 0.535969257459966930134953599918}, + {-0.844648334111417709024749456148, 0.535321577822907235244542789587}, + {-0.845058672136595356860766514728, 0.534673583269955621233293641126}, + {-0.845468513035528834720366830879, 0.534025274182310494275327528158}, + {-0.845877856567119001951482459845, 0.533376650941355334722970837902}, + {-0.846286702490559705758244035678, 0.532727713928658697106754971173}, + {-0.846695050565337226089468458667, 0.532078463525973766046206492319}, + {-0.847102900551231385861683520488, 0.531428900115237023982217579032}, + {-0.847510252208314329713800816535, 0.530779024078570249578490347631}, + {-0.847917105296951412185535446042, 0.530128835798278963409302377841}, + {-0.848323459577801641806615862151, 0.529478335656851983870296862733}, + {-0.848729314811816903940666634298, 0.528827524036962204334599846334}, + {-0.849134670760243515097442923434, 0.528176401321464594751375898340}, + {-0.849539527184620779642898469319, 0.527524967893398311069574901921}, + {-0.849943883846782211044512678200, 0.526873224135984696836487728433}, + {-0.850347740508854976759778310225, 0.526221170432628060353863475029}, + {-0.850751096933260897436923642090, 0.525568807166914564454884839506}, + {-0.851153952882715225669585379364, 0.524916134722613225704890282941}, + {-0.851556308120228866442857906804, 0.524263153483673582933022316865}, + {-0.851958162409106267709546500555, 0.523609863834228028700579216093}, + {-0.852359515512946974702401803370, 0.522956266158590143966478080984}, + {-0.852760367195645296867212437064, 0.522302360841254587064952374931}, + {-0.853160717221390307862805002515, 0.521648148266897315750156849390}, + {-0.853560565354666733739463779784, 0.520993628820374032883933068661}, + {-0.853959911360254064760511027998, 0.520338802886722073814951272652}, + {-0.854358755003227332558424222952, 0.519683670851158518999568514118}, + {-0.854757096048957221157138519629, 0.519028233099080860135643433750}, + {-0.855154934263109733905139364651, 0.518372490016066000961814097536}, + {-0.855552269411646748586974808859, 0.517716441987871367480522621918}, + {-0.855949101260826794579372744920, 0.517060089400432132400453610899}, + {-0.856345429577203609561308894627, 0.516403432639864101716398181452}, + {-0.856741254127627471781636359083, 0.515746472092461383240902250691}, + {-0.857136574679244978014480693673, 0.515089208144697163760383773479}, + {-0.857531390999498932536937445548, 0.514431641183223153923620429850}, + {-0.857925702856129679396701703809, 0.513773771594868255974120074825}, + {-0.858319510017173437077531161776, 0.513115599766640673173867526202}, + {-0.858712812250963519744573204662, 0.512457126085725800379577776766}, + {-0.859105609326130448266667372081, 0.511798350939486890176510769379}, + {-0.859497901011601728171740433027, 0.511139274715464275722354159370}, + {-0.859889687076602182713713773410, 0.510479897801376036881038089632}, + {-0.860280967290654396961713246128, 0.509820220585115668754383477790}, + {-0.860671741423578273710859321000, 0.509160243454754746217361116578}, + {-0.861062009245491477571476934827, 0.508499966798540925516647348559}, + {-0.861451770526809323946793028881, 0.507839391004897722226019141090}, + {-0.861841025038245223122146398964, 0.507178516462425510447076248965}, + {-0.862229772550811124354197545472, 0.506517343559898747251679651527}, + {-0.862618012835816738714811435784, 0.505855872686268970284118040581}, + {-0.863005745664870205224872279359, 0.505194104230662355270453645062}, + {-0.863392970809878423921190915280, 0.504532038582380271130034543603}, + {-0.863779688043046722789597424708, 0.503869676130898835886284814478}, + {-0.864165897136879079809546055913, 0.503207017265869249733611923148}, + {-0.864551597864179233177139849431, 0.502544062377115907658264859492}, + {-0.864936789998048904948291237815, 0.501880811854638397839778463094}, + {-0.865321473311889799440166370914, 0.501217266088609947338738948019}, + {-0.865705647579402381985858028202, 0.500553425469377533119086365332}, + {-0.866089312574586656090502856387, 0.499889290387461660003509678063}, + {-0.866472468071742940587398607022, 0.499224861233555250450422136055}, + {-0.866855113845470315325769661285, 0.498560138398525254377346982437}, + {-0.867237249670668397527606430231, 0.497895122273410983826380515893}, + {-0.867618875322536231564640729630, 0.497229813249424223986494553174}, + {-0.867999990576573510203672867647, 0.496564211717949177682385197841}, + {-0.868380595208579686428151944710, 0.495898318070542465374472840267}, + {-0.868760688994655194683502941189, 0.495232132698931404313213988644}, + {-0.869140271711200451676404554746, 0.494565655995016062451696825519}, + {-0.869519343134916855575511362986, 0.493898888350867482088801807549}, + {-0.869897903042806341922243973386, 0.493231830158727901913806590528}, + {-0.870275951212171716697696410847, 0.492564481811010923539839723162}, + {-0.870653487420617322456450892787, 0.491896843700299513102436321788}, + {-0.871030511446048261170460591529, 0.491228916219348388239041014458}, + {-0.871407023066670838318259484367, 0.490560699761082130709866078178}, + {-0.871783022060993117996474666143, 0.489892194718595186397891438901}, + {-0.872158508207824478830616499181, 0.489223401485151865308864671533}, + {-0.872533481286275947041986000841, 0.488554320454186452593603462446}, + {-0.872907941075760973603792081121, 0.487884952019301265657702515455}, + {-0.873281887355994101973521992477, 0.487215296574268874607582802128}, + {-0.873655319906992633427478267549, 0.486545354513030325893652161540}, + {-0.874028238509075738882359019044, 0.485875126229695253332607762786}, + {-0.874400642942864680939862864761, 0.485204612118542155663192261272}, + {-0.874772532989284035132016015268, 0.484533812574016342633598242173}, + {-0.875143908429560246631240261195, 0.483862727990732377492122395779}, + {-0.875514769045222740473377598391, 0.483191358763471967563418729696}, + {-0.875885114618103810535387765412, 0.482519705287184352826557187655}, + {-0.876254944930338508513045781001, 0.481847767956985972848116261957}, + {-0.876624259764365199032454256667, 0.481175547168160633315636687257}, + {-0.876993058902925781694648321718, 0.480503043316157674169630809047}, + {-0.877361342129065024941780848167, 0.479830256796594301071934296488}, + {-0.877729109226131454235542150855, 0.479157188005253364959656892097}, + {-0.878096359977777130012555062422, 0.478483837338083972667845955584}, + {-0.878463094167957758706677395821, 0.477810205191201264884881538819}, + {-0.878829311580933247860514256899, 0.477136291960885028373695604387}, + {-0.879195012001267373058510656847, 0.476462098043581361306308963321}, + {-0.879560195213827888949253974715, 0.475787623835901174462748031146}, + {-0.879924861003786862312381344964, 0.475112869734620302253347290389}, + {-0.880289009156621005125487045007, 0.474437836136679169651841903033}, + {-0.880652639458110897408005257603, 0.473762523439183069751123866808}, + {-0.881015751694342763578049471107, 0.473086932039400276384100152427}, + {-0.881378345651706807117875541735, 0.472411062334764153547439491376}, + {-0.881740421116898320796906318719, 0.471734914722871490067035438187}, + {-0.882101977876917575649429181794, 0.471058489601482499598006370434}, + {-0.882463015719069931996898503712, 0.470381787368520987158149182505}, + {-0.882823534430966505581750425335, 0.469704808422072683793402347874}, + {-0.883183533800523279388983155513, 0.469027553160387300490441475631}, + {-0.883543013615961769779971746175, 0.468350021981876585286386216467}, + {-0.883901973665809470581677942391, 0.467672215285114767358010112730}, + {-0.884260413738899186952835407283, 0.466994133468838001910228285851}, + {-0.884618333624369812540066959627, 0.466315776931944703243004823889}, + {-0.884975733111666551522489498893, 0.465637146073493823905664612539}, + {-0.885332611990540585544806617690, 0.464958241292706797587186429155}, + {-0.885688970051048962695006139256, 0.464279062988965818270514773758}, + {-0.886044807083555596705082280096, 0.463599611561813951254862331552}, + {-0.886400122878730378772615949856, 0.462919887410955410711466129214}, + {-0.886754917227550731873009226547, 0.462239890936253561282143209610}, + {-0.887109189921300056447250881320, 0.461559622537733194036491113366}, + {-0.887462940751568840624941003625, 0.460879082615578750115048478619}, + {-0.887816169510254438179686076182, 0.460198271570134320729295041019}, + {-0.888168875989561734662913750071, 0.459517189801903425117046708692}, + {-0.888521059982002148203150682093, 0.458835837711549399120514181050}, + {-0.888872721280395516885164397536, 0.458154215699893285762556160989}, + {-0.889223859677868211370821427408, 0.457472324167916166715031067724}, + {-0.889574474967854578189019321144, 0.456790163516757274919655174017}, + {-0.889924566944096717691081721568, 0.456107734147714105610305068694}, + {-0.890274135400644373028455902386, 0.455425036462242693868773812937}, + {-0.890623180131855818331132468302, 0.454742070861955671734477846258}, + {-0.890971700932396748484620729869, 0.454058837748624599672808699324}, + {-0.891319697597241389352973328641, 0.453375337524177801640234974911}, + {-0.891667169921672275734181312146, 0.452691570590700920195814660474}, + {-0.892014117701280473404779058910, 0.452007537350436416900834046828}, + {-0.892360540731965246052936890919, 0.451323238205783794363412653183}, + {-0.892706438809935276523788161285, 0.450638673559297819881663826891}, + {-0.893051811731707334551799704059, 0.449953843813690634867441531242}, + {-0.893396659294107609028401384421, 0.449268749371829978489500945216}, + {-0.893740981294271152890473786101, 0.448583390636739187673498463482}, + {-0.894084777529641772098045748862, 0.447897768011597585680050315204}, + {-0.894428047797973690968831306236, 0.447211881899738539214439470015}, + {-0.894770791897329553776785360242, 0.446525732704651456828059963300}, + {-0.895113009626081645997430769057, 0.445839320829980401139636114749}, + {-0.895454700782912449419370659598, 0.445152646679523644746012678297}, + {-0.895795865166813531921263802360, 0.444465710657233947777910998411}, + {-0.896136502577086657694849236577, 0.443778513167218502388777778833}, + {-0.896476612813344009289551195252, 0.443091054613737045375643219813}, + {-0.896816195675507188411756942514, 0.442403335401204189647472730940}, + {-0.897155250963808437170143861294, 0.441715355934187370312571374598}, + {-0.897493778478790305008772065776, 0.441027116617407177745491253518}, + {-0.897831778021305426662479476363, 0.440338617855737524120485204548}, + {-0.898169249392517965446813832386, 0.439649860054203645010062473375}, + {-0.898506192393901836901193291851, 0.438960843617984486364491658605}, + {-0.898842606827242263101140906656, 0.438271568952410539576902692716}, + {-0.899178492494635328569074772531, 0.437582036462964396594799154627}, + {-0.899513849198487980274308029038, 0.436892246555280305830848419646}, + {-0.899848676741518471722258709633, 0.436202199635144227674032890718}, + {-0.900182974926756696021357129212, 0.435511896108492224666264291955}, + {-0.900516743557543519749231109017, 0.434821336381412404392676762654}, + {-0.900849982437531338064218289219, 0.434130520860143365169392382086}, + {-0.901182691370684518794575978973, 0.433439449951074029510067475712}, + {-0.901514870161278514260061456298, 0.432748124060744032703951233998}, + {-0.901846518613901637628771368327, 0.432056543595841724414441387125}, + {-0.902177636533453508604907256085, 0.431364708963206500147435917825}, + {-0.902508223725145830584892792103, 0.430672620569826913872191198607}, + {-0.902838279994502834746583630476, 0.429980278822840622510170760506}, + {-0.903167805147360724937755094288, 0.429287684129534552468498986855}, + {-0.903496798989868343809916950704, 0.428594836897344677595356188249}, + {-0.903825261328487394862918336003, 0.427901737533854298334290433559}, + {-0.904153191969991665288830517966, 0.427208386446796428703720494013}, + {-0.904480590721468247217273983551, 0.426514784044051575850886592889}, + {-0.904807457390316649536998738768, 0.425820930733648184141060255570}, + {-0.905133791784249464029699083767, 0.425126826923762690668695540808}, + {-0.905459593711293142526130850456, 0.424432473022717637878287177955}, + {-0.905784862979786442593876927276, 0.423737869438984005032722279793}, + {-0.906109599398381981849581734423, 0.423043016581179154300684785994}, + {-0.906433802776045460802833986236, 0.422347914858067052801260388151}, + {-0.906757472922056662056888853840, 0.421652564678558272603936529777}, + {-0.907080609646008340085643339989, 0.420956966451709713172846250018}, + {-0.907403212757807997590475679317, 0.420261120586723102565684939691}, + {-0.907725282067676331188010863116, 0.419565027492946995835154666565}, + {-0.908046817386148341633145264495, 0.418868687579875165205578468886}, + {-0.908367818524072889729836788320, 0.418172101257146267005992967825}, + {-0.908688285292613251442617183784, 0.417475268934544618826265605094}, + {-0.909008217503247339941196969448, 0.416778191021997868048742930114}, + {-0.909327614967767261511255583173, 0.416080867929579378827753544101}, + {-0.909646477498279537599046307150, 0.415383300067506344710466237302}, + {-0.909964804907205659922908580484, 0.414685487846140066192646145282}, + {-0.910282597007281757406360611640, 0.413987431675985340095991205089}, + {-0.910599853611558818222704303480, 0.413289131967691181213098161606}, + {-0.910916574533403244906537565839, 0.412590589132048435327959623464}, + {-0.911232759586496188219939540431, 0.411891803579992277217769469644}, + {-0.911548408584833991241680450912, 0.411192775722600212251478524195}, + {-0.911863521342728522434128990426, 0.410493505971092353945550712524}, + {-0.912178097674806953598647396575, 0.409793994736831479475114292654}, + {-0.912492137396012537031708689028, 0.409094242431321197805971223715}, + {-0.912805640321603495301872044365, 0.408394249466208170140646416257}, + {-0.913118606267154131472807421233, 0.407694016253280222539245869484}, + {-0.913431035048554718080993097828, 0.406993543204466512452910365027}, + {-0.913742926482011497135715671902, 0.406292830731837362190361773173}, + {-0.914054280384046347052162673208, 0.405591879247604147895600590346}, + {-0.914365096571498447985959501239, 0.404890689164117800746822695146}, + {-0.914675374861522394454027562460, 0.404189260893870805357863673635}, + {-0.914985115071589305557608895469, 0.403487594849495367910208187823}, + {-0.915294317019487047026871096023, 0.402785691443763527175292438187}, + {-0.915602980523320120198604854522, 0.402083551089587321047957857445}, + {-0.915911105401509773038526418532, 0.401381174200017065700762941560}, + {-0.916218691472794111163580055290, 0.400678561188243409496578806284}, + {-0.916525738556228097841938051715, 0.399975712467595445609447324387}, + {-0.916832246471183887059908101946, 0.399272628451540989580337281950}, + {-0.917138215037350712499630844832, 0.398569309553686246250236990818}, + {-0.917443644074735109583684788959, 0.397865756187776031804759213628}, + {-0.917748533403661137519691237685, 0.397161968767691775372696838531}, + {-0.918052882844770379300314289139, 0.396457947707454017027828285791}, + {-0.918356692219021719658655911189, 0.395753693421220131831717026216}, + {-0.918659961347691900179768254020, 0.395049206323284718411770199964}, + {-0.918962690052375519300653650134, 0.394344486828079932028146004086}, + {-0.919264878154985143332567076868, 0.393639535350173153105401979701}, + {-0.919566525477751417483318618906, 0.392934352304269651767754112370}, + {-0.919867631843222843812668543251, 0.392228938105210422904178813042}, + {-0.920168197074266336343839611800, 0.391523293167972408213017843082}, + {-0.920468220994067110041214618832, 0.390817417907668440690827083017}, + {-0.920767703426128680810336391005, 0.390111312739547133610074070020}, + {-0.921066644194273531631722562452, 0.389404978078991159673449828915}, + {-0.921365043122642335404748337169, 0.388698414341519304926464428718}, + {-0.921662900035694732103763726627, 0.387991621942784969956363738675}, + {-0.921960214758209217755791087257, 0.387284601298575781314070809458}, + {-0.922256987115282922395920195413, 0.386577352824814202136849417002}, + {-0.922553216932332720290332872537, 0.385869876937555533746859737221}, + {-0.922848904035094008690975897480, 0.385162174052990025074905133806}, + {-0.923144048249621818058585631661, 0.384454244587440929770139064203}, + {-0.923438649402290367973478169006, 0.383746088957365061311577392189}, + {-0.923732707319793289180154260976, 0.383037707579352015851981150263}, + {-0.924026221829143734609601779084, 0.382329100870124782840520083482}, + {-0.924319192757675156535412952508, 0.381620269246537580087874630408}, + {-0.924611619933039974306154817896, 0.380911213125578185234587635932}, + {-0.924903503183210906612998769560, 0.380201932924366103883073719771}, + {-0.925194842336480527400510709413, 0.379492429060152569597619276465}, + {-0.925485637221461487911255971994, 0.378782701950320432882080012860}, + {-0.925775887667086627708101786993, 0.378072752012384272202183410627}, + {-0.926065593502609307741124666791, 0.377362579663988506606386863496}, + {-0.926354754557602744213795631367, 0.376652185322909671683078158821}, + {-0.926643370661961229828307295975, 0.375941569407054476670282383566}, + {-0.926931441645899134584851708496, 0.375230732334459859966813155552}, + {-0.927218967339951682937737587054, 0.374519674523293488732633704785}, + {-0.927505947574975064817692782526, 0.373808396391851427420505160626}, + {-0.927792382182146324609561816033, 0.373096898358560746800094420905}, + {-0.928078270992963028085398491385, 0.372385180841977414534227364129}, + {-0.928363613839244483649792982760, 0.371673244260786461712342543251}, + {-0.928648410553130521094544747029, 0.370961089033801871828188723157}, + {-0.928932660967082712843989611429, 0.370248715579966636290976111923}, + {-0.929216364913883929865789923497, 0.369536124318350811535083266790}, + {-0.929499522226638452693237013591, 0.368823315668154017021862500769}, + {-0.929782132738772082447553657403, 0.368110290048703103771288169810}, + {-0.930064196284032362882499000989, 0.367397047879452709473468985379}, + {-0.930345712696488358339763635740, 0.366683589579985202977496783205}, + {-0.930626681810531652949691761023, 0.365969915570008963445758354283}, + {-0.930907103460875018363651633990, 0.365256026269360434266531001413}, + {-0.931186977482553746021665119770, 0.364541922098002235674840676438}, + {-0.931466303710925092040895378886, 0.363827603476023442308218136532}, + {-0.931745081981668721304856717325, 0.363113070823639416673245250422}, + {-0.932023312130786374396507198981, 0.362398324561191587100950073363}, + {-0.932300993994602644754365883273, 0.361683365109146004456874834432}, + {-0.932578127409764423561000512564, 0.360968192888095340542520261806}, + {-0.932854712213241121787632437190, 0.360252808318756889693901257488}, + {-0.933130748242325225305648928043, 0.359537211821973012870756747361}, + {-0.933406235334631517730485938955, 0.358821403818711137656549681196}, + {-0.933681173328098301666955194378, 0.358105384730061815368173938623}, + {-0.933955562060986732575429414283, 0.357389154977241052524306041960}, + {-0.934229401371880707749539851648, 0.356672714981588312443960830933}, + {-0.934502691099687865516898455098, 0.355956065164566848313398850223}, + {-0.934775431083638697060678168782, 0.355239205947763259096916499402}, + {-0.935047621163287323575730169978, 0.354522137752887711581450957965}, + {-0.935319261178511496268583869096, 0.353804861001772219530892016337}, + {-0.935590350969512374312841984647, 0.353087376116372586576375169898}, + {-0.935860890376814635871483005758, 0.352369683518766685370593449989}, + {-0.936130879241267033208373504749, 0.351651783631154568610099886428}, + {-0.936400317404041948599058287073, 0.350933676875858635568761201284}, + {-0.936669204706636060464575166407, 0.350215363675321800229767177370}, + {-0.936937540990869788259942652076, 0.349496844452109656220528677295}, + {-0.937205326098887847585672261630, 0.348778119628908478411233318184}, + {-0.937472559873159250187768520846, 0.348059189628525611492904090483}, + {-0.937739242156476970890821576177, 0.347340054873889025888189507896}, + {-0.938005372791958724754124432366, 0.346620715788047595307119763675}, + {-0.938270951623047078093975414959, 0.345901172794169153856813636594}, + {-0.938535978493508560305258470180, 0.345181426315542660976376510007}, + {-0.938800453247434774084467790090, 0.344461476775576536102363434111}, + {-0.939064375729241951340497962519, 0.343741324597798436624174200915}, + {-0.939327745783671286261551358621, 0.343020970205855812995565656820}, + {-0.939590563255789157359743057896, 0.342300414023513743799753683561}, + {-0.939852827990986683381890998135, 0.341579656474657267217764911038}, + {-0.940114539834980278421028287994, 0.340858697983289493649294854549}, + {-0.940375698633811540894100744481, 0.340137538973531772246161608564}, + {-0.940636304233847586608874280500, 0.339416179869623246823095996660}, + {-0.940896356481780715697027517308, 0.338694621095921466480405115362}, + {-0.941155855224629078747966559604, 0.337972863076899887602166927536}, + {-0.941414800309736232719615145470, 0.337250906237150704924943056540}, + {-0.941673191584771362983019571402, 0.336528751001382409047124610879}, + {-0.941931028897729616389256079856, 0.335806397794420397051595728044}, + {-0.942188312096931657180221009185, 0.335083847041206861483431111992}, + {-0.942445041031024777211655418796, 0.334361099166798958481905401641}, + {-0.942701215548981896752422926511, 0.333638154596370972715391189922}, + {-0.942956835500102119596022021142, 0.332915013755212707557973317307}, + {-0.943211900734010622038283599977, 0.332191677068729152022541484257}, + {-0.943466411100659319011185743875, 0.331468144962440758316546407514}, + {-0.943720366450326197949038942170, 0.330744417861983164286243663810}, + {-0.943973766633615873899998405250, 0.330020496193105583593307983392}, + {-0.944226611501459700548366527073, 0.329296380381672859627428806562}, + {-0.944478900905115548169987960136, 0.328572070853663744660622114679}, + {-0.944730634696167803632249615475, 0.327847568035170788824927967653}, + {-0.944981812726528036527895437757, 0.327122872352400784201620353997}, + {-0.945232434848434888152723942767, 0.326397984231672710908611634295}, + {-0.945482500914453738438680829859, 0.325672904099419957546501791512}, + {-0.945732010777477150043068832019, 0.324947632382188489330587799486}, + {-0.945980964290724757326245253353, 0.324222169506637014624317316702}, + {-0.946229361307743821463134281657, 0.323496515899536596361230067487}, + {-0.946477201682408564309412213333, 0.322770671987770985111865229555}, + {-0.946724485268921167602229616023, 0.322044638198334676193468339989}, + {-0.946971211921810884781791628484, 0.321318414958334963582586851771}, + {-0.947217381495934818147475198202, 0.320592002694990385602835658574}, + {-0.947462993846477696813224156358, 0.319865401835630447369140938463}, + {-0.947708048828952098752154142858, 0.319138612807696175899252466479}, + {-0.947952546299198561818855068850, 0.318411636038738010689996826841}, + {-0.948196486113385583749391116726, 0.317684471956418079674477894514}, + {-0.948439868128009511138998277602, 0.316957120988508200820632509931}, + {-0.948682692199895094553596663900, 0.316229583562890326220440329053}, + {-0.948924958186195155462883121800, 0.315501860107555875956109048275}, + {-0.949166665944390697262633693754, 0.314773951050606348722737948265}, + {-0.949407815332291460386215931067, 0.314045856820250879337663718616}, + {-0.949648406208035478215379043831, 0.313317577844809125320324483255}, + {-0.949888438430089299124858825962, 0.312589114552708713379303162583}, + {-0.950127911857248097504680117709, 0.311860467372485961057293479826}, + {-0.950366826348635784782459268172, 0.311131636732785543664192573488}, + {-0.950605181763705231468009060336, 0.310402623062358939964866522132}, + {-0.950842977962238156131036248553, 0.309673426790066541602897132179}, + {-0.951080214804345014378839096025, 0.308944048344875765721440075140}, + {-0.951316892150465553967819687387, 0.308214488155861110474376118873}, + {-0.951553009861368592758879003668, 0.307484746652203988492857433812}, + {-0.951788567798152129739719384816, 0.306754824263193059952214980513}, + {-0.952023565822243567069449454721, 0.306024721418221956614758028081}, + {-0.952258003795399599056281658704, 0.305294438546791779831579560778}, + {-0.952491881579706323179834726034, 0.304563976078509157652263183991}, + {-0.952725199037579573158041057468, 0.303833334443086300336034355496}, + {-0.952957956031764585880239337712, 0.303102514070341333418667773003}, + {-0.953190152425336556518686847994, 0.302371515390196188288740586358}, + {-0.953421788081700305461652078520, 0.301640338832678933655984110374}, + {-0.953652862864590500358019653504, 0.300908984827921943683293193317}, + {-0.953883376638071767139592793683, 0.300177453806161953497877448171}, + {-0.954113329266538912065698241349, 0.299445746197739781635505096347}, + {-0.954342720614716366611673947773, 0.298713862433100607596259123966}, + {-0.954571550547659630758801085904, 0.297981802942791973443092956586}, + {-0.954799818930753718682069575152, 0.297249568157465948736728478252}, + {-0.955027525629714157950900244032, 0.296517158507877465201119093763}, + {-0.955254670510586989529144830158, 0.295784574424884205701147266154}, + {-0.955481253439748656752783517732, 0.295051816339446992820683135506}, + {-0.955707274283906560441437250120, 0.294318884682627623927686499883}, + {-0.955932732910098170719948029728, 0.293585779885591369176012221942}, + {-0.956157629185692137241403543158, 0.292852502379604862081663441131}, + {-0.956381962978387734075624848629, 0.292119052596036377078547729980}, + {-0.956605734156215081753771301010, 0.291385430966355551962720937809}, + {-0.956828942587535369312945476850, 0.290651637922133498914689653247}, + {-0.957051588141040965318495636893, 0.289917673895040917120269341467}, + {-0.957273670685755195819410801050, 0.289183539316850368727784825751}, + {-0.957495190091032566392925673426, 0.288449234619434224935474730955}, + {-0.957716146226558984189125567354, 0.287714760234765110080701333573}, + {-0.957936538962351313841736555332, 0.286980116594915846128799330472}, + {-0.958156368168758709735755019210, 0.286245304132057398760480282363}, + {-0.958375633716461061695213174971, 0.285510323278461430884789251650}, + {-0.958594335476470216228506160405, 0.284775174466498359748811708414}, + {-0.958812473320129310394577260013, 0.284039858128637190404219836637}, + {-0.959030047119113659981337605132, 0.283304374697445626729574996716}, + {-0.959247056745429982349548936327, 0.282568724605590015919176494208}, + {-0.959463502071417506655848228547, 0.281832908285833516615070948319}, + {-0.959679382969746752607420603454, 0.281096926171038374864252773477}, + {-0.959894699313420529662721492059, 0.280360778694163870206068622792}, + {-0.960109450975773937031476634729, 0.279624466288266537716822313087}, + {-0.960323637830473919585472231120, 0.278887989386500556587833443700}, + {-0.960537259751520045014672177786, 0.278151348422115307634783221147}, + {-0.960750316613243948715705755603, 0.277414543828458259877578484520}, + {-0.960962808290309777881077479833, 0.276677576038972472538546298892}, + {-0.961174734657714080476864637603, 0.275940445487197150153946267892}, + {-0.961386095590786249331927137973, 0.275203152606767198484760683641}, + {-0.961596890965187744981790274323, 0.274465697831413502072450683045}, + {-0.961807120656913427936274274543, 0.273728081594960703792906997478}, + {-0.962016784542290559478772138391, 0.272990304331330035925162746935}, + {-0.962225882497979023710854562523, 0.272252366474536711127285570910}, + {-0.962434414400972104708387178107, 0.271514268458690644081343634753}, + {-0.962642380128595598343110850692, 0.270776010717996284959951935889}, + {-0.962849779558508922505666305369, 0.270037593686750787558281672318}, + {-0.963056612568704228927174426644, 0.269299017799346285251260724181}, + {-0.963262879037507069313051033532, 0.268560283490267948103280559735}, + {-0.963468578843575951253797029494, 0.267821391194094149401649929132}, + {-0.963673711865903226403418102564, 0.267082341345496188100838708124}, + {-0.963878277983814202301005025220, 0.266343134379238455355931591839}, + {-0.964082277076968030549153354514, 0.265603770730176491632335000759}, + {-0.964285709025357373747056044522, 0.264864250833259373685280024802}, + {-0.964488573709308405490503446345, 0.264124575123527549624924404270}, + {-0.964690871009481032416488233139, 0.263384744036113227494411148655}, + {-0.964892600806868783180902937602, 0.262644758006240375269868536634}, + {-0.965093762982799585614657189581, 0.261904617469222833481268253308}, + {-0.965294357418934656500653090916, 0.261164322860466646680777103029}, + {-0.965494383997269500774507378082, 0.260423874615468120552463915374}, + {-0.965693842600133689479946497158, 0.259683273169813766401148313889}, + {-0.965892733110190859768806603824, 0.258942518959180467685854409865}, + {-0.966091055410438714901033563365, 0.258201612419335146952903414785}, + {-0.966288809384209579356195263244, 0.257460553986133267034830396369}, + {-0.966485994915169732699666838016, 0.256719344095520773940677372593}, + {-0.966682611887320075716445444414, 0.255977983183532431521456373957}, + {-0.966878660184995908366545336321, 0.255236471686291654936695749711}, + {-0.967074139692866929784997864772, 0.254494810040011065765952480433}, + {-0.967269050295937793393363790528, 0.253752998680990216051611696457}, + {-0.967463391879547440765918508987, 0.253011038045618030789540853220}, + {-0.967657164329369878785769287788, 0.252268928570370865038796637236}, + {-0.967850367531413624533342954237, 0.251526670691812614943927428612}, + {-0.968043001372022260397898207884, 0.250784264846594384668065913502}, + {-0.968235065737874212032920695492, 0.250041711471454930482138934167}, + {-0.968426560515983192445332861098, 0.249299011003218357052091391779}, + {-0.968617485593697535861679170921, 0.248556163878796670951842884278}, + {-0.968807840858700974884243350971, 0.247813170535187671239540918577}, + {-0.968997626199012418446443462017, 0.247070031409475227013317066849}, + {-0.969186841502985951812831899588, 0.246326746938829332922438197784}, + {-0.969375486659311280668305244035, 0.245583317560504277299315845084}, + {-0.969563561557013176006591947953, 0.244839743711840807094404226518}, + {-0.969751066085452140264067111275, 0.244096025830264268252633996781}, + {-0.969938000134323963230542631209, 0.243352164353284716735714710012}, + {-0.970124363593660277160779514816, 0.242608159718496724233105510393}, + {-0.970310156353828112685278028948, 0.241864012363579461428741979034}, + {-0.970495378305530453921790012828, 0.241119722726294810621894271208}, + {-0.970680029339806127453016415529, 0.240375291244489558417640751031}, + {-0.970864109348029469259699908434, 0.239630718356093619370028591220}, + {-0.971047618221911101876742122840, 0.238886004499120008226498157455}, + {-0.971230555853497268259388874867, 0.238141150111665145239214780304}, + {-0.971412922135170830983952328097, 0.237396155631906830008048814307}, + {-0.971594716959650162024786368420, 0.236651021498106517437776119550}, + {-0.971775940219990141955008766672, 0.235905748148607458114511814529}, + {-0.971956591809581715857291328575, 0.235160336021834726061285891774}, + {-0.972136671622152226390767282282, 0.234414785556295079960165139710}, + {-0.972316179551765302768728815863, 0.233669097190577101930131220797}, + {-0.972495115492821193825534464850, 0.232923271363349171370060730624}, + {-0.972673479340056434949701724690, 0.232177308513361824182652526360}, + {-0.972851270988544181150814438297, 0.231431209079445809884134632739}, + {-0.973028490333694207059522796044, 0.230684973500512174870991088937}, + {-0.973205137271252795905240873253, 0.229938602215552539975718104870}, + {-0.973381211697303183605356480257, 0.229192095663637018798652889018}, + {-0.973556713508265558765231162397, 0.228445454283916632443052208146}, + {-0.973731642600896396544385424932, 0.227698678515621255602496830761}, + {-0.973905998872289568879523358191, 0.226951768798059838605496452146}, + {-0.974079782219875678350717862486, 0.226204725570620102104157922440}, + {-0.974252992541422502270620498166, 0.225457549272768814629941402927}, + {-0.974425629735034992684461485624, 0.224710240344049627658762346982}, + {-0.974597693699154943303142317745, 0.223962799224085573612796906673}, + {-0.974769184332561766659352997522, 0.223215226352577039703461991849}, + {-0.974940101534371827973757262953, 0.222467522169301823442566501399}, + {-0.975110445204038778221899974596, 0.221719687114115521220369942057}, + {-0.975280215241354109245719428145, 0.220971721626949335615108793718}, + {-0.975449411546446376597430116817, 0.220223626147812517883650684780}, + {-0.975618034019781754651035043935, 0.219475401116790397315625682495}, + {-0.975786082562163925580023260409, 0.218727046974044436744577524223}, + {-0.975953557074734301401974789769, 0.217978564159812121525661154919}, + {-0.976120457458971912956258165650, 0.217229953114407070557945189648}, + {-0.976286783616693631948635356821, 0.216481214278216954616240741416}, + {-0.976452535450054059928959304671, 0.215732348091705994352906827771}, + {-0.976617712861545528291173923208, 0.214983354995412878629679198639}, + {-0.976782315753998653384826411639, 0.214234235429950931051124030091}, + {-0.976946344030581559358950016758, 0.213484989836008359764818465010}, + {-0.977109797594800766340483733075, 0.212735618654346148037603825287}, + {-0.977272676350500857367364915262, 0.211986122325800496746239787171}, + {-0.977434980201864256343924353132, 0.211236501291280770464808824727}, + {-0.977596709053411894174701046722, 0.210486755991769747264896750494}, + {-0.977757862810002764675232356240, 0.209736886868323230137534096684}, + {-0.977918441376834257638961389603, 0.208986894362070352304527887100}, + {-0.978078444659442380881841927476, 0.208236778914211523305866080591}, + {-0.978237872563700983086221185658, 0.207486540966020760468069283888}, + {-0.978396724995823086068469365273, 0.206736180958843718258322041947}, + {-0.978555001862359663533652565093, 0.205985699334097882573502147352}, + {-0.978712703070200418231650019152, 0.205235096533272654006907487201}, + {-0.978869828526574004001759021776, 0.204484372997927460469114180341}, + {-0.979026378139047581683485077519, 0.203733529169694060900752674570}, + {-0.979182351815526930138844363682, 0.202982565490274546871063421349}, + {-0.979337749464256779319271117856, 0.202231482401441453600199338325}, + {-0.979492570993820810265617637924, 0.201480280345037676692498962439}, + {-0.979646816313141211018944431999, 0.200728959762976416625335218669}, + {-0.979800485331479675821242381062, 0.199977521097239374636700404153}, + {-0.979953577958436738981617963873, 0.199225964789878973171255438501}, + {-0.980106094103951774876293256966, 0.198474291283016412990036769770}, + {-0.980258033678303553060118247231, 0.197722501018841895215061299496}, + {-0.980409396592109794177360981848, 0.196970594439614649084901998322}, + {-0.980560182756327836095522343385, 0.196218571987661127842272890121}, + {-0.980710392082253967771521274699, 0.195466434105377145913351455420}, + {-0.980860024481523873340904629003, 0.194714181235226047039787999893}, + {-0.981009079866112632117847169866, 0.193961813819738870812159348134}, + {-0.981157558148334940639756496239, 0.193209332301513908580758993594}, + {-0.981305459240844557555760729883, 0.192456737123217119789231333016}, + {-0.981452783056635524872035603039, 0.191704028727579994795249263007}, + {-0.981599529509040724661872445722, 0.190951207557401914094441508496}, + {-0.981745698511732989288702810882, 0.190198274055548177674523913083}, + {-0.981891289978725101406098474399, 0.189445228664950171548753132811}, + {-0.982036303824369016801654197479, 0.188692071828605534289380329938}, + {-0.982180739963357085642314814322, 0.187938803989576130870631232028}, + {-0.982324598310721164295955531998, 0.187185425590990495159360307298}, + {-0.982467878781833170442894243024, 0.186431937076041692735728361185}, + {-0.982610581292404750008984137821, 0.185678338887987626204534308272}, + {-0.982752705758487832277126017289, 0.184924631470150702128307784733}, + {-0.982894252096474074775755980227, 0.184170815265917997560762842113}, + {-0.983035220223095640434962660947, 0.183416890718739289400929237672}, + {-0.983175610055424420430369991664, 0.182662858272129413617079762844}, + {-0.983315421510872811339254440099, 0.181908718369666211334134686695}, + {-0.983454654507193271051335159427, 0.181154471454990750878266680957}, + {-0.983593308962478651835681375815, 0.180400117971807549821505745058}, + {-0.983731384795162089318409925909, 0.179645658363882410046841187068}, + {-0.983868881924017113504987719352, 0.178891093075044887994451414670}, + {-0.984005800268157870824836663814, 0.178136422549186379526986456767}, + {-0.984142139747038569019821352413, 0.177381647230260064418416732224}, + {-0.984277900280454365322668763838, 0.176626767562280795331730587350}, + {-0.984413081788540700323153487261, 0.175871783989325319863539220933}, + {-0.984547684191773964101912497426, 0.175116696955530115609178665181}, + {-0.984681707410970941118932842073, 0.174361506905093888164515192329}, + {-0.984815151367289143280459029484, 0.173606214282275461702198526837}, + {-0.984948015982227031983597953513, 0.172850819531394028771842386050}, + {-0.985080301177623796071713968558, 0.172095323096829316833478173976}, + {-0.985212006875659351834428889561, 0.171339725423019534344959424743}, + {-0.985343132998854787096831842064, 0.170584026954463757741464746687}, + {-0.985473679470071806107966949639, 0.169828228135719933034053497067}, + {-0.985603646212513395674648108979, 0.169072329411405014587543860216}, + {-0.985733033149723492094551602349, 0.168316331226194770831483538132}, + {-0.985861840205586981156216097588, 0.167560234024823867526876597367}, + {-0.985990067304330031205950035655, 0.166804038252083924875890375006}, + {-0.986117714370520093147831630631, 0.166047744352825932256934038378}, + {-0.986244781329065456354499019653, 0.165291352771958027778609334746}, + {-0.986371268105216025823267500527, 0.164534863954445942368920441368}, + {-0.986497174624562767064617219148, 0.163778278345312972019698349868}, + {-0.986622500813038372236007944593, 0.163021596389638090407459003472}, + {-0.986747246596916482985761831515, 0.162264818532558197095028162948}, + {-0.986871411902812467609180657746, 0.161507945219266202396823928211}, + {-0.986994996657682976959335974243, 0.160750976895011221667886047726}, + {-0.987118000788826277513976492628, 0.159993914005098186725817299703}, + {-0.987240424223882251375528085191, 0.159236756994888151162115264015}, + {-0.987362266890832396271093784890, 0.158479506309796153162849918772}, + {-0.987483528717999714530151322833, 0.157722162395293741266044662552}, + {-0.987604209634049046151460515830, 0.156964725696906809426778295347}, + {-0.987724309567987068803063266387, 0.156207196660215874572941174847}, + {-0.987843828449161742710771250131, 0.155449575730856159871962063335}, + {-0.987962766207263420881190540968, 0.154691863354515679596090649284}, + {-0.988081122772324071945604373468, 0.153934059976937542835173644562}, + {-0.988198898074717613226880530419, 0.153176166043917927339634843520}, + {-0.988316092045159688694866417791, 0.152418182001306329320655663651}, + {-0.988432704614708335100203839829, 0.151660108295005258138843373672}, + {-0.988548735714763204818211761449, 0.150901945370970319570957940414}, + {-0.988664185277066231982701083325, 0.150143693675208411697497012938}, + {-0.988779053233701521463672179380, 0.149385353653779862082018325964}, + {-0.988893339517095126822709971748, 0.148626925752796595903149068363}, + {-0.989007044060015272357588855812, 0.147868410418422191465737114413}, + {-0.989120166795572686169180087745, 0.147109808096872130001031564461}, + {-0.989232707657220045049939471937, 0.146351119234411713998511572754}, + {-0.989344666578752529595419673569, 0.145592344277358537452116138411}, + {-0.989456043494307713181967756100, 0.144833483672080293169770470740}, + {-0.989566838338365117877515331202, 0.144074537864995189107020223673}, + {-0.989677051045747213642300721403, 0.143315507302571421011094798814}, + {-0.989786681551618641172751722479, 0.142556392431327616510117195503}, + {-0.989895729791486655990695453511, 0.141797193697830586911479144874}, + {-0.990004195701200906398753431858, 0.141037911548697825203646516457}, + {-0.990112079216953766547248960705, 0.140278546430595479899139377267}, + {-0.990219380275280003367299741512, 0.139519098790238438301258838692}, + {-0.990326098813057331682330186595, 0.138759569074390687326570059668}, + {-0.990432234767505970118861569063, 0.137999957729863037547701765106}, + {-0.990537788076188752128814485332, 0.137240265203515759973029730645}, + {-0.990642758677011570078718705190, 0.136480491942256365600627532331}, + {-0.990747146508222709115898396703, 0.135720638393039938485173934168}, + {-0.990850951508413624324589363823, 0.134960705002868691648743038058}, + {-0.990954173616518496636729196325, 0.134200692218792300147711671343}, + {-0.991056812771814343854259732325, 0.133440600487905874915739445896}, + {-0.991158868913921353716034445824, 0.132680430257352183209818008436}, + {-0.991260341982802439808608596650, 0.131920181974319816742280409017}, + {-0.991361231918763463610844155482, 0.131159856086043247191952332287}, + {-0.991461538662453678583119653922, 0.130399453039803020493181406891}, + {-0.991561262154865175055817871907, 0.129638973282923813945544111448}, + {-0.991660402337333213296233225265, 0.128878417262776712171046256117}, + {-0.991758959151536112486269303190, 0.128117785426777208712678657321}, + {-0.991856932539495472767043793283, 0.127357078222385428079022062775}, + {-0.991954322443575953194283556513, 0.126596296097105792677339763941}, + {-0.992051128806485715827534477285, 0.125835439498487300369333752315}, + {-0.992147351571276092663254075887, 0.125074508874121387291822316001}, + {-0.992242990681341696657113971014, 0.124313504671644370347394215059}, + {-0.992338046080420421723999879760, 0.123552427338735421047388740590}, + {-0.992432517712593664782616542652, 0.122791277323116732045349408509}, + {-0.992526405522286103710882798623, 0.122030055072553697548265461137}, + {-0.992619709454266141435141435068, 0.121268761034852845526188502845}, + {-0.992712429453645461840949337784, 0.120507395657864294080674483212}, + {-0.992804565465879140795379953488, 0.119745959389479683654400332671}, + {-0.992896117436765979213930677361, 0.118984452677632357442405464099}, + {-0.992987085312448392038220390532, 0.118222875970297083836335616525}, + {-0.993077469039412297213686997566, 0.117461229715490278469047780163}, + {-0.993167268564487226711889888975, 0.116699514361267894790863408616}, + {-0.993256483834846437552812403737, 0.115937730355727922071373825474}, + {-0.993345114798006911804861829296, 0.115175878147008248220117820892}, + {-0.993433161401829356584869401559, 0.114413958183286895708974384434}, + {-0.993520623594518093035787842382, 0.113651970912782201983404206658}, + {-0.993607501324621611438203672151, 0.112889916783750751672066314768}, + {-0.993693794541031683031917509652, 0.112127796244489819077472247955}, + {-0.993779503192984581261271159747, 0.111365609743335244874451461783}, + {-0.993864627230059749507518063183, 0.110603357728661741421483100112}, + {-0.993949166602181133356452846783, 0.109841040648882518060425184103}, + {-0.994033121259616403442294085835, 0.109078658952449517038907345068}, + {-0.994116491152977066469986766606, 0.108316213087851373475523075740}, + {-0.994199276233218909304412136407, 0.107553703503615760705969250921}, + {-0.994281476451641554881177853531, 0.106791130648307447392753033455}, + {-0.994363091759888573228920449765, 0.106028494970528380791918721116}, + {-0.994444122109947925558515180455, 0.105265796918917922675440479452}, + {-0.994524567454151631196168636961, 0.104503036942150823174202400878}, + {-0.994604427745175656561116284138, 0.103740215488939552246350217501}, + {-0.994683702936040248232529847883, 0.102977333008032301275846975841}, + {-0.994762392980109932949517315137, 0.102214389948213205117077961859}, + {-0.994840497831093184544215546339, 0.101451386758302009027943313413}, + {-0.994918017443043201097907513031, 0.100688323887154249081099521845}, + {-0.994994951770356905740300135221, 0.099925201783659281518090722329}, + {-0.995071300767776167894851369056, 0.099162020896742628095488214512}, + {-0.995147064390386471011140656628, 0.098398781675363936050082713791}, + {-0.995222242593618355854800938687, 0.097635484568517172387913660714}, + {-0.995296835333246088239889104443, 0.096872130025230804295510722568}, + {-0.995370842565388991296515541762, 0.096108718494565759105086044656}, + {-0.995444264246510335247819512006, 0.095345250425617797396249386566}, + {-0.995517100333418114566086387640, 0.094581726267515542350139412520}, + {-0.995589350783264603883537802176, 0.093818146469420563016150538260}, + {-0.995661015553546913103843962745, 0.093054511480527180022903621648}, + {-0.995732094602106432290611337521, 0.092290821750062632111699656434}, + {-0.995802587887129164734290043270, 0.091527077727285036101712023537}, + {-0.995872495367145726952173845348, 0.090763279861485759991701627314}, + {-0.995941817001031348688400157698, 0.089999428601987396802996954648}, + {-0.996010552748005872913950042857, 0.089235524398143986624098999982}, + {-0.996078702567633866848950674466, 0.088471567699341099877408112206}, + {-0.996146266419824621962675337272, 0.087707558954993922184506516260}, + {-0.996213244264832042951240964612, 0.086943498614549544201146602518}, + {-0.996279636063254647737608138414, 0.086179387127484990971382217140}, + {-0.996345441776035900538488476741, 0.085415224943307346827658932398}, + {-0.996410661364464100842042171280, 0.084651012511553547223996929461}, + {-0.996475294790172161363273062307, 0.083886750281790503636081268724}, + {-0.996539342015137941110936026234, 0.083122438703613132915393180156}, + {-0.996602803001684134365234513098, 0.082358078226646674879773968314}, + {-0.996665677712478159655518084037, 0.081593669300544707789768494877}, + {-0.996727966110532492827189798845, 0.080829212374989301004291064601}, + {-0.996789668159204556019403753453, 0.080064707899691223147442542540}, + {-0.996850783822196606642762617412, 0.079300156324387860440339181878}, + {-0.996911313063555737379317633895, 0.078535558098845659191766799267}, + {-0.996971255847674320271778469760, 0.077770913672858044130009602668}, + {-0.997030612139289451612000902969, 0.077006223496245654325242924187}, + {-0.997089381903483396030196672655, 0.076241488018855996244838024722}, + {-0.997147565105683475472631016601, 0.075476707690563693553542634618}, + {-0.997205161711661847157017746213, 0.074711882961268433200885397127}, + {-0.997262171687536169706334021612, 0.073947014280897338522891004686}, + {-0.997318594999768603948098188994, 0.073182102099402943085060257999}, + {-0.997374431615167145181999330816, 0.072417146866763384971399375445}, + {-0.997429681500884179889965253096, 0.071652149032982545562298071218}, + {-0.997484344624417929026094498113, 0.070887109048088065010873037863}, + {-0.997538420953611226771329256735, 0.070122027362133701466895274734}, + {-0.997591910456652630756479993579, 0.069356904425197291041982339266}, + {-0.997644813102075422861503284366, 0.068591740687380955976415464193}, + {-0.997697128858758497393921516050, 0.067826536598810799327807785630}, + {-0.997748857695925694955008111720, 0.067061292609637113137921460293}, + {-0.997799999583146468573602305696, 0.066296009170032352275647724582}, + {-0.997850554490335106549991905922, 0.065530686730193465905358607415}, + {-0.997900522387751620634332994086, 0.064765325740339940718826028387}, + {-0.997949903246001190915137613047, 0.063999926650713911957524260288}, + {-0.997998697036034276841576229344, 0.063234489911580413212810469759}, + {-0.998046903729146839268082658236, 0.062469015973225253124390121684}, + {-0.998094523296980007387446676148, 0.061703505285957478687652866256}, + {-0.998141555711520522820023870736, 0.060937958300107293585501366806}, + {-0.998188000945100295524525790825, 0.060172375466026280232956224836}, + {-0.998233858970396847887229796470, 0.059406757234087087526930304193}, + {-0.998279129760433203699676596443, 0.058641104054683632074151944380}, + {-0.998323813288577555091762860684, 0.057875416378229078973038923550}, + {-0.998367909528543817643253532879, 0.057109694655158194098731883059}, + {-0.998411418454391297316874442913, 0.056343939335925345701650002184}, + {-0.998454340040524801480614769389, 0.055578150871004657063156884078}, + {-0.998496674261694638907727039623, 0.054812329710890193845695961272}, + {-0.998538421092996730799029592163, 0.054046476306093924057982746945}, + {-0.998579580509872499760604114272, 0.053280591107148118912295586824}, + {-0.998620152488108869803795641928, 0.052514674564603312789667910465}, + {-0.998660137003838488389817484858, 0.051748727129028476712235828927}, + {-0.998699534033539282340541376470, 0.050982749251010740787481978487}, + {-0.998738343554035234994614711468, 0.050216741381155609313946541761}, + {-0.998776565542495609051343308238, 0.049450703970084879113056075539}, + {-0.998814199976435390659901258914, 0.048684637468439082019777686128}, + {-0.998851246833715178397028466861, 0.047918542326875389336660049366}, + {-0.998887706092541294289333109191, 0.047152418996067840817332239567}, + {-0.998923577731465783813291636761, 0.046386267926707497322169615472}, + {-0.998958861729386082828341386630, 0.045620089569500407722379975439}, + {-0.998993558065545683710695357149, 0.044853884375169995879506501524}, + {-0.999027666719533691264132357901, 0.044087652794455041427301722479}, + {-0.999061187671284600675392084668, 0.043321395278109839366287303619}, + {-0.999094120901079074670292357041, 0.042555112276903950263573506163}, + {-0.999126466389543388402216805844, 0.041788804241622366786312881004}, + {-0.999158224117649429452114873129, 0.041022471623063459789104712172}, + {-0.999189394066714919873106737214, 0.040256114872041420804649192178}, + {-0.999219976218403527212785775191, 0.039489734439384180375576249844}, + {-0.999249970554724420424008712871, 0.038723330775933595404580955801}, + {-0.999279377058032713954105474841, 0.037956904332545650382346735796}, + {-0.999308195711029467744879184465, 0.037190455560088375719374198525}, + {-0.999336426496761132121093851310, 0.036423984909444290236635310976}, + {-0.999364069398620546991196533781, 0.035657492831508326436296130169}, + {-0.999391124400346053668897639000, 0.034890979777188017851852208651}, + {-0.999417591486021716917775847833, 0.034124446197403263125735861649}, + {-0.999443470640077769040487964958, 0.033357892543086443970512533497}, + {-0.999468761847290054767256606283, 0.032591319265180447584118184068}, + {-0.999493465092780586367382511526, 0.031824726814641025873786617240}, + {-0.999517580362016988537732231634, 0.031058115642434762360135636072}, + {-0.999541107640812942491947978851, 0.030291486199539262996749400259}, + {-0.999564046915327741871237776650, 0.029524838936943319234185167943}, + {-0.999586398172067069900492697343, 0.028758174305644874924059450905}, + {-0.999608161397882000187564699445, 0.027991492756653423706891814504}, + {-0.999629336579970106946291252825, 0.027224794740987972446744080912}, + {-0.999649923705874243751168251038, 0.026458080709677204295227070929}, + {-0.999669922763483764782677098992, 0.025691351113759232360767015280}, + {-0.999689333741033636648865012830, 0.024924606404281769711506200338}, + {-0.999708156627104882474554869987, 0.024157847032300082401601315496}, + {-0.999726391410624470879042746674, 0.023391073448879397267408108974}, + {-0.999744038080865426998400380398, 0.022624286105092861892673639090}, + {-0.999761096627446610440870244929, 0.021857485452021714611436919995}, + {-0.999777567040332937331470475328, 0.021090671940755464919270423252}, + {-0.999793449309835269289692405437, 0.020323846022389856907919281070}, + {-0.999808743426610524451803030388, 0.019557008148029266653145086252}, + {-0.999823449381661566448542544094, 0.018790158768784658710471191512}, + {-0.999837567166337093382821876730, 0.018023298335773763056977259112}, + {-0.999851096772332192941235007311, 0.017256427300120818352224816294}, + {-0.999864038191687676260244188597, 0.016489546112956738471710949057}, + {-0.999876391416790410993087334646, 0.015722655225417079410954457330}, + {-0.999888156440373321309778020805, 0.014955755088644438408063130908}, + {-0.999899333255515387897105483717, 0.014188846153786403500585144855}, + {-0.999909921855641536936332158803, 0.013421928871995746079814892937}, + {-0.999919922234522751125496142777, 0.012655003694430583954799729440}, + {-0.999929334386276069679411193647, 0.011888071072252355195320028258}, + {-0.999938158305364588329666730715, 0.011121131456628203376668651003}, + {-0.999946393986597459324627834576, 0.010354185298728944483737102189}, + {-0.999954041425129780407132784603, 0.009587233049729245587533554840}, + {-0.999961100616462816859097983979, 0.008820275160807350758873646157}, + {-0.999967571556443779456913034664, 0.008053312083145275357409786920}, + {-0.999973454241265935493743199913, 0.007286344267926744312779963053}, + {-0.999978748667468830824134329305, 0.006519372166339609461771509302}, + {-0.999983454831937734752500546165, 0.005752396229573797370449028676}, + {-0.999987572731904084122334097628, 0.004985416908821490612757632022}, + {-0.999991102364945594338507817156, 0.004218434655277307314402701621}, + {-0.999994043728985815278065274470, 0.003451449920136257648595190517}, + {-0.999996396822294353334825700585, 0.002684463154596144259661505416}, + {-0.999998161643486982441686450329, 0.001917474809855521144033585479}, + {-0.999999338191525533048320539820, 0.001150485337113869724681713969}, + {-0.999999926465717892121176646469, 0.000383495187571336311558450882}}; diff --git a/src/fft/twiddles.cuh b/src/fft/twiddles.cuh new file mode 100644 index 000000000..c776f974f --- /dev/null +++ b/src/fft/twiddles.cuh @@ -0,0 +1,28 @@ + +#ifndef GPU_BOOTSTRAP_TWIDDLES_CUH +#define GPU_BOOTSTRAP_TWIDDLES_CUH + +// TODO (Agnes) depending on the device architecture +// can we make more of them __constant__? +// Do we have to define them all regardless of the +// polynomial degree and q values? + +// TODO (Beka) make those two arrays with dynamic size +// or find exact maximum for 8192 length poly it shuld +// be less than 2048 +extern __constant__ short SW1[2048]; +extern __constant__ short SW2[2048]; + +extern __constant__ double2 negTwids3[4]; +extern __constant__ double2 negTwids4[8]; +extern __constant__ double2 negTwids5[16]; +extern __constant__ double2 negTwids6[32]; +extern __constant__ double2 negTwids7[64]; +extern __constant__ double2 negTwids8[128]; +extern __constant__ double2 negTwids9[256]; +extern __constant__ double2 negTwids10[512]; +extern __constant__ double2 negTwids11[1024]; +extern __device__ double2 negTwids12[2048]; +extern __device__ double2 negTwids13[4096]; + +#endif diff --git a/src/keyswitch.cu b/src/keyswitch.cu new file mode 100644 index 000000000..d713aa839 --- /dev/null +++ b/src/keyswitch.cu @@ -0,0 +1,55 @@ +#include "keyswitch.cuh" +#include "keyswitch.h" +#include "polynomial/parameters.cuh" + +#include + +/* Perform keyswitch on a batch of input LWE ciphertexts for 32 bits + * + * - lwe_out: output batch of num_samples keyswitched ciphertexts c = + * (a0,..an-1,b) where n is the LWE dimension + * - lwe_in: input batch of num_samples LWE ciphertexts, containing n + * mask values + 1 body value + * + * This function calls a wrapper to a device kernel that performs the keyswitch + * - num_samples blocks of threads are launched + */ +void cuda_keyswitch_lwe_ciphertext_vector_32(void *v_stream, void *lwe_out, void *lwe_in, + void *ksk, + uint32_t lwe_dimension_before, + uint32_t lwe_dimension_after, + uint32_t base_log, uint32_t l_gadget, + uint32_t num_samples) { + cuda_keyswitch_lwe_ciphertext_vector( + v_stream, static_cast(lwe_out), static_cast(lwe_in), + static_cast(ksk), + lwe_dimension_before, lwe_dimension_after, + base_log, l_gadget, + num_samples); +} + +/* Perform keyswitch on a batch of input LWE ciphertexts for 64 bits + * + * - lwe_out: output batch of num_samples keyswitched ciphertexts c = + * (a0,..an-1,b) where n is the LWE dimension + * - lwe_in: input batch of num_samples LWE ciphertexts, containing n + * mask values + 1 body value + * + * This function calls a wrapper to a device kernel that performs the keyswitch + * - num_samples blocks of threads are launched + */ +void cuda_keyswitch_lwe_ciphertext_vector_64(void *v_stream, void *lwe_out, void *lwe_in, + void *ksk, + uint32_t lwe_dimension_before, + uint32_t lwe_dimension_after, + uint32_t base_log, uint32_t l_gadget, + uint32_t num_samples) { + cuda_keyswitch_lwe_ciphertext_vector( + v_stream, static_cast(lwe_out), static_cast (lwe_in), + static_cast(ksk), + lwe_dimension_before, lwe_dimension_after, + base_log, l_gadget, + num_samples); +} + + diff --git a/src/keyswitch.cuh b/src/keyswitch.cuh new file mode 100644 index 000000000..ebf06a6be --- /dev/null +++ b/src/keyswitch.cuh @@ -0,0 +1,146 @@ +#ifndef CNCRT_KS_H +#define CNCRT_KS_H + +#include "crypto/gadget.cuh" +#include "crypto/torus.cuh" +#include "polynomial/polynomial.cuh" +#include +#include + +template +__device__ Torus *get_ith_block(Torus *ksk, int i, int level, + uint32_t lwe_dimension_after, + uint32_t l_gadget) { + int pos = i * l_gadget * (lwe_dimension_after + 1) + + level * (lwe_dimension_after + 1); + Torus *ptr = &ksk[pos]; + return ptr; +} + +/* + * keyswitch kernel + * Each thread handles a piece of the following equation: + * $$GLWE_s2(\Delta.m+e) = (0,0,..,0,b) - \sum_{i=0,k-1} $$ where k is the dimension of + * the GLWE ciphertext. If the polynomial dimension in GLWE is > 1, this + * equation is solved for each polynomial coefficient. where Dec denotes the + * decomposition with base beta and l levels and the inner product is done + * between the decomposition of a_i and l GLWE encryptions of s1_i q/\beta^j, + * with j in [1,l] We obtain a GLWE encryption of Delta.m (with Delta the + * scaling factor) under key s2 instead of s1, with an increased noise + * + */ +template +__global__ void keyswitch(Torus *lwe_out, Torus *lwe_in, + Torus *ksk, + uint32_t lwe_dimension_before, + uint32_t lwe_dimension_after, + uint32_t base_log, + uint32_t l_gadget, + int lwe_lower, int lwe_upper, int cutoff) { + int tid = threadIdx.x; + + extern __shared__ char sharedmem[]; + + Torus *local_lwe_out = (Torus *)sharedmem; + + auto block_lwe_in = + get_chunk(lwe_in, blockIdx.x, lwe_dimension_before + 1); + auto block_lwe_out = + get_chunk(lwe_out, blockIdx.x, lwe_dimension_after + 1); + + auto gadget = GadgetMatrixSingle(base_log, l_gadget); + + int lwe_part_per_thd; + if (tid < cutoff) { + lwe_part_per_thd = lwe_upper; + } else { + lwe_part_per_thd = lwe_lower; + } + __syncthreads(); + + for (int k = 0; k < lwe_part_per_thd; k++) { + int idx = tid + k * blockDim.x; + local_lwe_out[idx] = 0; + } + + if (tid == 0) { + local_lwe_out[lwe_dimension_after] = + block_lwe_in[lwe_dimension_before]; + } + + for (int i = 0; i < lwe_dimension_before; i++) { + + __syncthreads(); + + Torus a_i = round_to_closest_multiple(block_lwe_in[i], base_log, + l_gadget); + + for (int j = 0; j < l_gadget; j++) { + auto ksk_block = get_ith_block(ksk, i, j, lwe_dimension_after, l_gadget); + Torus decomposed = gadget.decompose_one_level_single(a_i, (uint32_t)j); + for (int k = 0; k < lwe_part_per_thd; k++) { + int idx = tid + k * blockDim.x; + local_lwe_out[idx] -= (Torus)ksk_block[idx] * decomposed; + } + } + } + + for (int k = 0; k < lwe_part_per_thd; k++) { + int idx = tid + k * blockDim.x; + block_lwe_out[idx] = local_lwe_out[idx]; + } +} + +/// assume lwe_in in the gpu +template +__host__ void cuda_keyswitch_lwe_ciphertext_vector(void *v_stream, Torus *lwe_out, Torus *lwe_in, + Torus *ksk, + uint32_t lwe_dimension_before, + uint32_t lwe_dimension_after, + uint32_t base_log, + uint32_t l_gadget, + uint32_t num_samples) { + + constexpr int ideal_threads = 128; + + int lwe_dim = lwe_dimension_after + 1; + int lwe_lower, lwe_upper, cutoff; + if (lwe_dim % ideal_threads == 0) { + lwe_lower = lwe_dim / ideal_threads; + lwe_upper = lwe_dim / ideal_threads; + cutoff = 0; + } else { + int y = + ceil((double)lwe_dim / (double)ideal_threads) * ideal_threads - lwe_dim; + cutoff = ideal_threads - y; + lwe_lower = lwe_dim / ideal_threads; + lwe_upper = (int)ceil((double)lwe_dim / (double)ideal_threads); + } + +// int lwe_size_before = +// (lwe_dimension_before + 1) * num_samples; + int lwe_size_after = + (lwe_dimension_after + 1) * num_samples; + + int shared_mem = + sizeof(Torus) * (lwe_dimension_after + 1); + + cudaMemset(lwe_out, 0, sizeof(Torus) * lwe_size_after); + + dim3 grid(num_samples, 1, 1); + dim3 threads(ideal_threads, 1, 1); + + cudaFuncSetAttribute(keyswitch, + cudaFuncAttributeMaxDynamicSharedMemorySize, shared_mem); + + auto stream = static_cast(v_stream); + keyswitch<<>>( + lwe_out, lwe_in, ksk, lwe_dimension_before, lwe_dimension_after, base_log, + l_gadget, lwe_lower, lwe_upper, cutoff); + + cudaStreamSynchronize(*stream); + +} + +#endif diff --git a/src/polynomial/functions.cuh b/src/polynomial/functions.cuh new file mode 100644 index 000000000..d64446024 --- /dev/null +++ b/src/polynomial/functions.cuh @@ -0,0 +1,261 @@ +#ifndef GPU_POLYNOMIAL_FUNCTIONS +#define GPU_POLYNOMIAL_FUNCTIONS +#include "utils/memory.cuh" +#include "utils/timer.cuh" + +/* + * function compresses decomposed buffer into half size complex buffer for fft + */ +template +__device__ void real_to_complex_compressed(T *src, double2 *dst) { + int tid = threadIdx.x; +#pragma unroll + for (int i = 0; i < params::opt / 2; i++) { + dst[tid].x = (double)src[2 * tid]; + dst[tid].y = (double)src[2 * tid + 1]; + tid += params::degree / params::opt; + } +} + +/* + * copy source polynomial to specific slice of batched polynomials + * used only in low latency version + */ +template +__device__ void copy_into_ith_polynomial_low_lat(T *source, T *dst, int i) { + int tid = threadIdx.x; + int begin = i * (params::degree / 2 + 1); +#pragma unroll + for (int i = 0; i < params::opt / 2; i++) { + dst[tid + begin] = source[tid]; + tid = tid + params::degree / params::opt; + } + + if (threadIdx.x == 0) { + dst[params::degree / 2 + begin] = source[params::degree / 2]; + } +} + +/* + * accumulates source polynomial into specific slice of batched polynomial + * used only in low latency version + */ +template +__device__ void add_polynomial_inplace_low_lat(T *source, T *dst, int p_id) { + int tid = threadIdx.x; + int begin = p_id * (params::degree / 2 + 1); +#pragma unroll + for (int i = 0; i < params::opt / 2; i++) { + dst[tid] += source[tid + begin]; + tid = tid + params::degree / params::opt; + } + + if (threadIdx.x == 0) { + dst[params::degree / 2] += source[params::degree / 2 + begin]; + } +} + +/* + * Performs acc = acc * (X^ä + 1) if zeroAcc = false + * Performs acc = 0 if zeroAcc + * takes single buffer and calculates inplace. + */ +template +__device__ void divide_by_monomial_negacyclic_inplace(T *accumulator, T *input, + uint32_t j, + bool zeroAcc) { + int tid = threadIdx.x; + constexpr int degree = block_size * elems_per_thread; + if (zeroAcc) { + for (int i = 0; i < elems_per_thread; i++) { + accumulator[tid] = 0; + tid += block_size; + } + } else { + tid = threadIdx.x; + for (int i = 0; i < elems_per_thread; i++) { + if (j < degree) { + if (tid < degree - j) { + accumulator[tid] = input[tid + j]; + } else { + accumulator[tid] = -input[tid - degree + j]; + } + } else { + uint32_t jj = j - degree; + if (tid < degree - jj) { + accumulator[tid] = -input[tid + jj]; + } else { + accumulator[tid] = input[tid - degree + jj]; + } + } + tid += block_size; + } + } +} + +/* + * Performs result_acc = acc * (X^ä - 1) - acc + * takes single buffer as input returns single rotated buffer + */ +template +__device__ void +multiply_by_monomial_negacyclic_and_sub_polynomial(T *acc, T *result_acc, + uint32_t j) { + int tid = threadIdx.x; + constexpr int degree = block_size * elems_per_thread; + for (int i = 0; i < elems_per_thread; i++) { + if (j < degree) { + if (tid < j) { + result_acc[tid] = -acc[tid - j + degree] - acc[tid]; + } else { + result_acc[tid] = acc[tid - j] - acc[tid]; + } + } else { + uint32_t jj = j - degree; + if (tid < jj) { + result_acc[tid] = acc[tid - jj + degree] - acc[tid]; + + } else { + result_acc[tid] = -acc[tid - jj] - acc[tid]; + } + } + tid += block_size; + } +} + +/* + * performs a rounding to increase accuracy of the PBS + * calculates inplace. + */ +template +__device__ void round_to_closest_multiple_inplace(T *rotated_acc, int base_log, + int l_gadget) { + int tid = threadIdx.x; + for (int i = 0; i < elems_per_thread; i++) { + + T x_acc = rotated_acc[tid]; + T shift = sizeof(T) * 8 - l_gadget * base_log; + T mask = 1ll << (shift - 1); + T b_acc = (x_acc & mask) >> (shift - 1); + T res_acc = x_acc >> shift; + res_acc += b_acc; + res_acc <<= shift; + rotated_acc[tid] = res_acc; + tid = tid + block_size; + } +} + +template +__device__ void add_to_torus(double2 *m_values, Torus *result) { + Torus mx = (sizeof(Torus) == 4) ? UINT32_MAX : UINT64_MAX; + int tid = threadIdx.x; +#pragma unroll + // TODO (Beka) check if better memory access is possible + for (int i = 0; i < params::opt / 2; i++) { + double v1 = m_values[tid].x; + double v2 = m_values[tid].y; + + double frac = v1 - floor(v1); + frac *= mx; + double carry = frac - floor(frac); + double zero_point_five = 1. / 2.; + if (carry >= zero_point_five) + frac++; + + + Torus V1 = typecast_double_to_torus(frac); + + frac = v2 - floor(v2); + frac *= mx; + carry = frac - floor(v2); + if (carry >= zero_point_five) + frac++; + + Torus V2 = typecast_double_to_torus(frac); + + result[tid * 2] += V1; + result[tid * 2 + 1] += V2; + tid = tid + params::degree / params::opt; + } +} + +template +__device__ void sample_extract_body(Torus *lwe_out, Torus *accumulator) { + // Set first coefficient of the accumulator as the body of the LWE sample + // todo(Joao): not every thread needs to set it + // if (threadIdx.x == 0) + lwe_out[params::degree] = accumulator[0]; +} + +template +__device__ void sample_extract_mask(Torus *lwe_out, Torus *accumulator) { + // Set ACC = -ACC + // accumulator.negate_inplace(); + + int tid = threadIdx.x; +#pragma unroll + for (int i = 0; i < params::opt; i++) { + accumulator[tid] = -accumulator[tid]; + tid = tid + params::degree / params::opt; + } + synchronize_threads_in_block(); + + // Reverse the accumulator + // accumulator.reverse_inplace(); + + tid = threadIdx.x; + Torus result[params::opt]; +#pragma unroll + for (int i = 0; i < params::opt; i++) { + result[i] = accumulator[params::degree - tid - 1]; + tid = tid + params::degree / params::opt; + } + synchronize_threads_in_block(); + tid = threadIdx.x; +#pragma unroll + for (int i = 0; i < params::opt; i++) { + accumulator[tid] = result[i]; + tid = tid + params::degree / params::opt; + } + synchronize_threads_in_block(); + + // Perform ACC * X + // accumulator.multiply_by_monomial_negacyclic_inplace(1); + + tid = threadIdx.x; + result[params::opt]; + for (int i = 0; i < params::opt; i++) { + if (1 < params::degree) { + if (tid < 1) + result[i] = -accumulator[tid - 1 + params::degree]; + else + result[i] = accumulator[tid - 1]; + } else { + uint32_t jj = 1 - (uint32_t)params::degree; + if (tid < jj) + result[i] = accumulator[tid - jj + params::degree]; + else + result[i] = -accumulator[tid - jj]; + } + tid += params::degree / params::opt; + } + synchronize_threads_in_block(); + tid = threadIdx.x; + for (int i = 0; i < params::opt; i++) { + accumulator[tid] = result[i]; + tid += params::degree / params::opt; + } + synchronize_threads_in_block(); + + // Copy to the mask of the LWE sample + // accumulator.copy_into(lwe_out); + + tid = threadIdx.x; +#pragma unroll + for (int i = 0; i < params::opt; i++) { + lwe_out[tid] = accumulator[tid]; + tid = tid + params::degree / params::opt; + } +} + +#endif diff --git a/src/polynomial/parameters.cuh b/src/polynomial/parameters.cuh new file mode 100644 index 000000000..c375c3f11 --- /dev/null +++ b/src/polynomial/parameters.cuh @@ -0,0 +1,78 @@ +#ifndef CNCRT_PARAMETERS_H +#define CNCRT_PARAMETERS_H + +constexpr int log2(int n) { return (n <= 2) ? 1 : 1 + log2(n / 2); } + +constexpr int choose_opt(int degree) { + if (degree <= 1024) + return 4; + else if (degree == 2048) + return 8; + else if (degree == 4096) + return 16; + else + return 32; +} +template class HalfDegree { +public: + constexpr static int degree = params::degree / 2; + constexpr static int opt = params::opt / 2; + constexpr static int log2_degree = params::log2_degree - 1; + constexpr static int quarter = params::quarter / 2; + constexpr static int half = params::half / 2; + constexpr static int three_quarters = quarter + half; + constexpr static int warp = 32; + constexpr static int fft_sm_required = degree + degree / warp; +}; + +template class Degree { +public: + constexpr static int degree = N; + constexpr static int opt = choose_opt(N); + constexpr static int log2_degree = log2(N); + constexpr static int quarter = N / 4; + constexpr static int half = N / 2; + constexpr static int three_quarters = half + quarter; + constexpr static int warp = 32; + constexpr static int fft_sm_required = N + 32; +}; + +enum sharedMemDegree { + NOSM = 0, + PARTIALSM = 1, + FULLSM = 2 + +}; + +class ForwardFFT { +public: + constexpr static int direction = 0; +}; + +class BackwardFFT { +public: + constexpr static int direction = 1; +}; + +class ReorderFFT { + constexpr static int reorder = 1; +}; +class NoReorderFFT { + constexpr static int reorder = 0; +}; + +template +class FFTDegree : public params { +public: + constexpr static int fft_direction = direction::direction; + constexpr static int fft_reorder = reorder::reorder; +}; + +template +class FFTParams : public Degree { +public: + constexpr static int fft_direction = direction::direction; + constexpr static int fft_reorder = reorder::reorder; +}; + +#endif // CNCRT_PARAMETERS_H diff --git a/src/polynomial/polynomial.cuh b/src/polynomial/polynomial.cuh new file mode 100644 index 000000000..b1339c634 --- /dev/null +++ b/src/polynomial/polynomial.cuh @@ -0,0 +1,668 @@ +#ifndef CNCRT_POLYNOMIAL_H +#define CNCRT_POLYNOMIAL_H + +#include "complex/operations.cuh" +#include "crypto/torus.cuh" +#include "fft/bnsmfft.cuh" +#include "fft/smfft.cuh" +#include "parameters.cuh" +#include "utils/memory.cuh" +#include "utils/timer.cuh" +#include +#include + +#define PI 3.141592653589793238462643383279502884197 + +template +__device__ T *get_chunk(T *data, int chunk_num, int chunk_size) { + int pos = chunk_num * chunk_size; + T *ptr = &data[pos]; + return ptr; +} + +class ExtraMemory { +public: + uint32_t m_size; + __device__ ExtraMemory(uint32_t size) : m_size(size) {} +}; +template class PolynomialFourier; + +template class Polynomial; + +template class Vector; + +template class Twiddles; + +template class VectorPolynomial { +public: + T *m_data; + uint32_t m_num_polynomials; + + __device__ VectorPolynomial(T *data, uint32_t num_polynomials) + : m_data(data), m_num_polynomials(num_polynomials) {} + + __device__ VectorPolynomial(SharedMemory &shmem, uint32_t num_polynomials) + : m_num_polynomials(num_polynomials) { + shmem.get_allocation(&m_data, m_num_polynomials * params::degree); + } + + __device__ VectorPolynomial get_chunk(int chunk_num, + int chunk_size) { + int pos = chunk_num * chunk_size; + T *ptr = &m_data[pos]; + // todo(Joao): unsafe, user must pass chunk that has size multiple of + // polynomial degree + return VectorPolynomial(ptr, chunk_size / params::degree); + } + + __host__ VectorPolynomial() {} + + __host__ VectorPolynomial(DeviceMemory &dmem, uint32_t num_polynomials, + int device) + : m_num_polynomials(num_polynomials) { + dmem.get_allocation(&m_data, m_num_polynomials * params::degree, device); + } + + __host__ VectorPolynomial(DeviceMemory &dmem, T *source, + uint32_t num_polynomials, int device) + : m_num_polynomials(num_polynomials) { + dmem.get_allocation_and_copy_async( + &m_data, source, m_num_polynomials * params::degree, device); + } + + __host__ void copy_to_host(T *dest) { + cudaMemcpyAsync(dest, m_data, + sizeof(T) * m_num_polynomials * params::degree, + cudaMemcpyDeviceToHost); + } + + __device__ void copy_into(Polynomial &dest, + int polynomial_number = 0) { + int tid = threadIdx.x; + int begin = polynomial_number * params::degree; +#pragma unroll + for (int i = 0; i < params::opt; i++) { + dest.coefficients[tid] = m_data[tid + begin]; + tid = tid + params::degree / params::opt; + } + synchronize_threads_in_block(); + } + + // todo(Joao): we need to make these APIs more clear, as it's confusing what's + // being copied where + __device__ void copy_into_ith_polynomial(PolynomialFourier &source, + int i) { + int tid = threadIdx.x; + int begin = i * (params::degree / 2 + 1); +#pragma unroll + for (int i = 0; i < params::opt / 2; i++) { + this->m_data[tid + begin] = source.m_values[tid]; + tid = tid + params::degree / params::opt; + } + + if (threadIdx.x == 0) { + this->m_data[params::degree / 2 + begin] = + source.m_values[params::degree / 2]; + } + } + + __device__ void split_into_polynomials(Polynomial &first, + Polynomial &second) { + int tid = threadIdx.x; +#pragma unroll + for (int i = 0; i < params::opt; i++) { + first.coefficients[tid] = m_data[tid]; + second.coefficients[tid] = m_data[tid + params::degree]; + tid = tid + params::degree / params::opt; + } + } +}; + +template class PolynomialFourier { +public: + T *m_values; + uint32_t degree; + + __device__ __host__ PolynomialFourier(T *m_values) : m_values(m_values) {} + + __device__ PolynomialFourier(SharedMemory &shmem) : degree(degree) { + shmem.get_allocation(&this->m_values, params::degree); + } + + __device__ PolynomialFourier(SharedMemory &shmem, ExtraMemory extra_memory) + : degree(degree) { + shmem.get_allocation(&this->m_values, params::degree + extra_memory.m_size); + } + __device__ PolynomialFourier(SharedMemory &shmem, uint32_t degree) + : degree(degree) { + shmem.get_allocation(&this->m_values, degree); + } + + __host__ PolynomialFourier(DeviceMemory &dmem, int device) : degree(degree) { + dmem.get_allocation(&this->m_values, params::degree, device); + } + + __device__ char *reuse_memory() { return (char *)m_values; } + __device__ void copy_from(PolynomialFourier &source, int begin) { + int tid = threadIdx.x; +#pragma unroll + for (int i = 0; i < params::opt; i++) { + this->m_values[tid + begin] = source.m_values[tid]; + tid = tid + params::degree / params::opt; + } + } + __device__ void fill_with(T value) { + int tid = threadIdx.x; +#pragma unroll + for (int i = 0; i < params::opt; i++) { + m_values[tid] = value; + tid += params::degree / params::opt; + } + } + + /* + __device__ void add_polynomial_inplace(PolynomialFourier &source, + int begin) { + int tid = threadIdx.x; +#pragma unroll + for (int i = 0; i < params::opt / 2; i++) { + this->m_values[tid] += source.m_values[tid + begin]; + tid = tid + params::degree / params::opt; + } + if (threadIdx.x == 0) { + this->m_values[params::degree / 2] += source.m_values[params::degree / 2 + +begin]; + } + } + */ + + __device__ void swap_quarters_inplace() { + int tid = threadIdx.x; + int s1 = params::quarter; + int s2 = params::three_quarters; + + T tmp = m_values[s2 + tid]; + m_values[s2 + tid] = m_values[s1 + tid]; + m_values[s1 + tid] = tmp; + } + + __device__ void add_polynomial_inplace(VectorPolynomial &source, + int polynomial_number) { + int tid = threadIdx.x; + int begin = polynomial_number * (params::degree / 2 + 1); +#pragma unroll + for (int i = 0; i < params::opt / 2; i++) { + this->m_values[tid] += source.m_data[tid + begin]; + tid = tid + params::degree / params::opt; + } + + if (threadIdx.x == 0) { + this->m_values[params::degree / 2] += + source.m_data[params::degree / 2 + begin]; + } + } + + __device__ void + forward_negacyclic_fft_inplace(PolynomialFourier &X) { + // TODO function should be removed + } + + __device__ void inverse_negacyclic_fft_inplace() { + // TODO function should be removed + } + + template + __device__ void add_to_torus(Polynomial &result) { + // TODO function should be removed + } + + __device__ T &operator[](int i) { return m_values[i]; } +}; + +template class Polynomial { +public: + T *coefficients; + uint32_t degree; + + __device__ Polynomial(T *coefficients, uint32_t degree) + : coefficients(coefficients), degree(degree) {} + + __device__ Polynomial(char *memory, uint32_t degree) + : coefficients((T *)memory), degree(degree) {} + + __device__ Polynomial(SharedMemory &shmem, uint32_t degree) : degree(degree) { + shmem.get_allocation(&this->coefficients, degree); + } + + __host__ Polynomial(DeviceMemory &dmem, uint32_t degree, int device) + : degree(degree) { + dmem.get_allocation(&this->coefficients, params::degree, device); + } + + __host__ Polynomial(DeviceMemory &dmem, T *source, uint32_t degree, + int device) + : degree(degree) { + dmem.get_allocation_and_copy_async(&this->coefficients, source, + params::degree, device); + } + + __host__ void copy_to_host(T *dest) { + cudaMemcpyAsync(dest, this->coefficients, sizeof(T) * params::degree, + cudaMemcpyDeviceToHost); + } + + __device__ T get_coefficient(int i) { return this->coefficients[i]; } + + __device__ char *reuse_memory() { return (char *)coefficients; } + + __device__ void copy_coefficients_from(Polynomial &source, + int begin_dest = 0, + int begin_src = 0) { + int tid = threadIdx.x; +#pragma unroll + for (int i = 0; i < params::opt; i++) { + this->coefficients[tid + begin_dest] = source.coefficients[tid]; + tid = tid + params::degree / params::opt; + } + } + + __device__ void fill_with(T value) { + int tid = threadIdx.x; +#pragma unroll + for (int i = 0; i < params::opt; i++) { + coefficients[tid] = value; + tid += params::degree / params::opt; + } + } + + __device__ void multiply_by_monomial_negacyclic(Polynomial &result, + uint32_t j) { + int tid = threadIdx.x; + for (int i = 0; i < params::opt; i++) { + if (j < params::degree) { + if (tid < j) + result.coefficients[tid] = + -this->coefficients[tid - j + params::degree]; + else + result.coefficients[tid] = this->coefficients[tid - j]; + } else { + uint32_t jj = j - params::degree; + if (tid < jj) + result.coefficients[tid] = + this->coefficients[tid - jj + params::degree]; + else + result.coefficients[tid] = -this->coefficients[tid - jj]; + } + tid += params::degree / params::opt; + } + } + + __device__ void multiply_by_monomial_negacyclic_inplace(uint32_t j) { + int tid = threadIdx.x; + T result[params::opt]; + for (int i = 0; i < params::opt; i++) { + if (j < params::degree) { + if (tid < j) + result[i] = -this->coefficients[tid - j + params::degree]; + else + result[i] = this->coefficients[tid - j]; + } else { + uint32_t jj = j - params::degree; + if (tid < jj) + result[i] = this->coefficients[tid - jj + params::degree]; + else + result[i] = -this->coefficients[tid - jj]; + } + tid += params::degree / params::opt; + } + synchronize_threads_in_block(); + tid = threadIdx.x; + for (int i = 0; i < params::opt; i++) { + coefficients[tid] = result[i]; + tid += params::degree / params::opt; + } + synchronize_threads_in_block(); + } + + __device__ void multiply_by_monomial_negacyclic_and_sub_polynomial( + Polynomial &result, uint32_t j) { + int tid = threadIdx.x; + for (int i = 0; i < params::opt; i++) { + if (j < params::degree) { + if (tid < j) + result.coefficients[tid] = + -this->coefficients[tid - j + params::degree] - + this->coefficients[tid]; + else + result.coefficients[tid] = + this->coefficients[tid - j] - this->coefficients[tid]; + } else { + uint32_t jj = j - params::degree; + if (tid < jj) + result.coefficients[tid] = + this->coefficients[tid - jj + params::degree] - + this->coefficients[tid]; + else + result.coefficients[tid] = + -this->coefficients[tid - jj] - this->coefficients[tid]; + } + tid += params::degree / params::opt; + } + } + + __device__ void divide_by_monomial_negacyclic(Polynomial &result, + uint32_t j) { + int tid = threadIdx.x; + for (int i = 0; i < params::opt; i++) { + if (j < params::degree) { + if (tid < params::degree - j) { + result.coefficients[tid] = this->coefficients[tid + j]; + } else { + result.coefficients[tid] = + -this->coefficients[tid - params::degree + j]; + } + } else { + uint32_t jj = j - params::degree; + if (tid < params::degree - jj) { + result.coefficients[tid] = -this->coefficients[tid + jj]; + } else { + result.coefficients[tid] = + this->coefficients[tid - params::degree + jj]; + } + } + tid += params::degree / params::opt; + } + } + + __device__ void divide_by_monomial_negacyclic_inplace(uint32_t j) { + int tid = threadIdx.x; + T result[params::opt]; + for (int i = 0; i < params::opt; i++) { + if (j < params::degree) { + if (tid < params::degree - j) { + result[i] = this->coefficients[tid + j]; + } else { + result[i] = -this->coefficients[tid - params::degree + j]; + } + } else { + uint32_t jj = j - params::degree; + if (tid < params::degree - jj) { + result[i] = -this->coefficients[tid + jj]; + } else { + result[i] = this->coefficients[tid - params::degree + jj]; + } + } + tid += params::degree / params::opt; + } + tid = threadIdx.x; + for (int i = 0; i < params::opt; i++) { + coefficients[tid] = result[i]; + tid = tid + params::degree / params::opt; + } + } + + __device__ void round_to_closest_multiple_inplace(uint32_t base_log, + uint32_t l_gadget) { + int tid = threadIdx.x; +#pragma unroll + for (int i = 0; i < params::opt; i++) { + + T x = coefficients[tid]; + T shift = sizeof(T) * 8 - l_gadget * base_log; + T mask = 1ll << (shift - 1); + T b = (x & mask) >> (shift - 1); + T res = x >> shift; + res += b; + res <<= shift; + coefficients[tid] = res; + tid = tid + params::degree / params::opt; + } + } + + __device__ void + to_complex_compressed(PolynomialFourier &dest) { + + int tid = threadIdx.x; +#pragma unroll + for (int i = 0; i < params::opt / 2; i++) { + dest.m_values[tid].x = (double)coefficients[2 * tid]; + dest.m_values[tid].y = (double)coefficients[2 * tid + 1]; + tid += params::degree / params::opt; + } + } + + __device__ void to_complex(PolynomialFourier &dest) { + int tid = threadIdx.x; +#pragma unroll + for (int i = 0; i < params::opt; i++) { + dest.m_values[tid].x = (double)coefficients[tid]; + dest.m_values[tid].y = 0.0; + tid += params::degree / params::opt; + } + } + + __device__ void multiply_by_scalar_inplace(T scalar) { + int tid = threadIdx.x; + const int grid_dim = blockDim.x; + const int slices = params::degree / grid_dim; + const int jump = grid_dim; + for (int i = 0; i < slices; i++) { + this->coefficients[tid] *= scalar; + tid += jump; + } + } + + __device__ void add_scalar_inplace(T scalar) { + int tid = threadIdx.x; + const int grid_dim = blockDim.x; + const int slices = params::degree / grid_dim; + const int jump = grid_dim; + for (int i = 0; i < slices; i++) { + this->coefficients[tid] += scalar; + tid += jump; + } + } + + __device__ void sub_scalar_inplace(T scalar) { + int tid = threadIdx.x; + const int grid_dim = blockDim.x; + const int slices = params::degree / grid_dim; + const int jump = grid_dim; + for (int i = 0; i < slices; i++) { + this->coefficients[tid] -= scalar; + tid += jump; + } + } + + /* + __device__ void add_polynomial_inplace(Polynomial &source, + int begin) { + int tid = threadIdx.x; +#pragma unroll + for (int i = 0; i < params::opt; i++) { + this->coefficients[tid] += source.coefficients[tid + begin]; + tid = tid + params::degree / params::opt; + } + } + */ + + __device__ void sub_polynomial_inplace(Polynomial &rhs) { + int tid = threadIdx.x; + const int grid_dim = blockDim.x; + const int slices = params::degree / grid_dim; + const int jump = grid_dim; + for (int i = 0; i < slices; i++) { + this->coefficients[tid] -= rhs.coefficients[tid]; + tid += jump; + } + } + + __device__ void negate_inplace() { + int tid = threadIdx.x; +#pragma unroll + for (int i = 0; i < params::opt; i++) { + coefficients[tid] = -coefficients[tid]; + tid = tid + params::degree / params::opt; + } + synchronize_threads_in_block(); + } + + __device__ void copy_into(Vector &vec) { + int tid = threadIdx.x; +#pragma unroll + for (int i = 0; i < params::opt; i++) { + vec.m_data[tid] = coefficients[tid]; + tid = tid + params::degree / params::opt; + } + } + + __device__ void copy_reversed_into(Vector &vec) { + int tid = threadIdx.x; +#pragma unroll + for (int i = 0; i < params::opt; i++) { + vec.m_data[tid] = coefficients[params::degree - tid - 1]; + tid = tid + params::degree / params::opt; + } + } + + __device__ void reverse_inplace() { + int tid = threadIdx.x; + T result[params::opt]; +#pragma unroll + for (int i = 0; i < params::opt; i++) { + result[i] = coefficients[params::degree - tid - 1]; + tid = tid + params::degree / params::opt; + } + synchronize_threads_in_block(); + tid = threadIdx.x; +#pragma unroll + for (int i = 0; i < params::opt; i++) { + coefficients[tid] = result[i]; + tid = tid + params::degree / params::opt; + } + synchronize_threads_in_block(); + } + + template + __device__ void + forward_negacyclic_fft_half(PolynomialFourier &result) { + // TODO function should be removed + } +}; +template class Vector { +public: + T *m_data; + uint32_t m_size; + + __device__ Vector(T *elements, uint32_t size) + : m_data(elements), m_size(size) {} + + template + __device__ Vector(SharedMemory &shmem, V src, int size) : m_size(size) { + shmem.get_allocation(&m_data, m_size); + int tid = threadIdx.x; +#pragma unroll + for (int i = 0; i < params::opt && tid < m_size; i++) { + if (tid > m_size) + continue; + m_data[tid] = src[tid]; + tid += params::degree / params::opt; + } + } + + __device__ Vector(SharedMemory &shmem, uint32_t size) : m_size(size) { + shmem.get_allocation(&m_data, m_size); + } + + __host__ Vector() {} + + __host__ Vector(DeviceMemory &dmem, uint32_t size, int device) + : m_size(size) { + dmem.get_allocation(&m_data, m_size, device); + } + + __device__ T &operator[](int i) { return m_data[i]; } + + __device__ Vector get_chunk(int chunk_num, int chunk_size) { + int pos = chunk_num * chunk_size; + T *ptr = &m_data[pos]; + return Vector(ptr, chunk_size); + } + + __host__ void copy_to_device(T *source, uint32_t elements) { + cudaMemcpyAsync(m_data, source, sizeof(T) * elements, + cudaMemcpyHostToDevice); + } + + __host__ Vector(DeviceMemory &dmem, T *source, uint32_t size_source, + int device) + : m_size(size_source) { + dmem.get_allocation_and_copy_async(&m_data, source, m_size, device); + } + + __host__ Vector(DeviceMemory &dmem, T *source, uint32_t allocation_size, + uint32_t copy_size, int device) + : m_size(allocation_size) { + if (copy_size > allocation_size) { + printf("warning: copying more than allocation"); + } + dmem.get_allocation_and_copy_async(&m_data, source, m_size, copy_size, + device); + } + + __host__ void copy_to_host(T *dest) { + cudaMemcpyAsync(dest, m_data, sizeof(T) * m_size, cudaMemcpyDeviceToHost); + } + + __host__ void copy_to_host(T *dest, int elements) { + cudaMemcpyAsync(dest, m_data, sizeof(T) * elements, cudaMemcpyDeviceToHost); + } + + __device__ T get_ith_element(int i) { return m_data[i]; } + + __device__ T get_last_element() { return m_data[m_size - 1]; } + + __device__ void set_last_element(T elem) { m_data[m_size - 1] = elem; } + + // todo(Joao): let's do coalesced access here at some point + __device__ void operator-=(const Vector &rhs) { + assert(m_size == rhs->m_size); + int tid = threadIdx.x; + int pos = tid; + int total = m_size / blockDim.x + 1; + for (int i = 0; i < total; i++) { + if (pos < m_size) + m_data[pos] -= rhs.m_data[pos]; + pos += blockDim.x; + } + } + + __device__ void operator*=(const T &rhs) { + int tid = threadIdx.x; + int pos = tid; + int total = m_size / blockDim.x + 1; + for (int i = 0; i < total; i++) { + if (pos < m_size) + m_data[pos] *= rhs; + pos += blockDim.x; + } + } +}; + +template class Twiddles { +public: + Vector twiddles2, twiddles3, twiddles4, twiddles5, twiddles6, + twiddles7, twiddles8, twiddles9, twiddles10; + + __device__ + Twiddles(Vector &twiddles2, Vector &twiddles3, + Vector &twiddles4, Vector &twiddles5, + Vector &twiddles6, Vector &twiddles7, + Vector &twiddles8, Vector &twiddles9, + Vector &twiddles10) + : twiddles2(twiddles2), twiddles3(twiddles3), twiddles4(twiddles4), + twiddles5(twiddles5), twiddles6(twiddles6), twiddles7(twiddles7), + twiddles8(twiddles8), twiddles9(twiddles9), twiddles10(twiddles10) {} +}; + +#endif // CNCRT_POLYNOMIAL_H diff --git a/src/polynomial/polynomial_math.cuh b/src/polynomial/polynomial_math.cuh new file mode 100644 index 000000000..d1dc96900 --- /dev/null +++ b/src/polynomial/polynomial_math.cuh @@ -0,0 +1,65 @@ +#ifndef CNCRT_POLYNOMIAL_MATH_H +#define CNCRT_POLYNOMIAL_MATH_H + +#include "crypto/torus.cuh" +#include "parameters.cuh" +#include "polynomial.cuh" + +template +__device__ void polynomial_product_in_fourier_domain(FT *result, FT *first, + FT *second) { + int tid = threadIdx.x; + for (int i = 0; i < params::opt / 2; i++) { + result[tid] = first[tid] * second[tid]; + tid += params::degree / params::opt; + } + + if (threadIdx.x == 0) { + result[params::degree / 2] = + first[params::degree / 2] * second[params::degree / 2]; + } +} + +template +__device__ void polynomial_product_in_fourier_domain( + PolynomialFourier &result, PolynomialFourier &first, + PolynomialFourier &second) { + int tid = threadIdx.x; + for (int i = 0; i < params::opt / 2; i++) { + result[tid] = first[tid] * second[tid]; + tid += params::degree / params::opt; + } + + if (threadIdx.x == 0) { + result[params::degree / 2] = + first[params::degree / 2] * second[params::degree / 2]; + } +} + +template +__device__ void polynomial_product_accumulate_in_fourier_domain( + PolynomialFourier &result, PolynomialFourier &first, + PolynomialFourier &second) { + int tid = threadIdx.x; + for (int i = 0; i < params::opt / 2; i++) { + result[tid] += first[tid] * second[tid]; + tid += params::degree / params::opt; + } + + if (threadIdx.x == 0) { + result[params::degree / 2] += + first[params::degree / 2] * second[params::degree / 2]; + } +} + +template +__device__ void polynomial_product_accumulate_in_fourier_domain( + FT *result, FT *first, PolynomialFourier &second) { + int tid = threadIdx.x; + for (int i = 0; i < params::opt / 2; i++) { + result[tid] += first[tid] * second.m_values[tid]; + tid += params::degree / params::opt; + } +} + +#endif // CNCRT_POLYNOMIAL_MATH_H diff --git a/src/polynomial/polynomial_twiddles.cuh b/src/polynomial/polynomial_twiddles.cuh new file mode 100644 index 000000000..2d45f44c7 --- /dev/null +++ b/src/polynomial/polynomial_twiddles.cuh @@ -0,0 +1 @@ +#include "polynomial.cuh" \ No newline at end of file diff --git a/src/types/int128.cuh b/src/types/int128.cuh new file mode 100644 index 000000000..0cb268dd5 --- /dev/null +++ b/src/types/int128.cuh @@ -0,0 +1,76 @@ +#ifndef CNCRT_INT128_H +#define CNCRT_INT128_H + +// abseil's int128 type +// licensed under Apache license + +class uint128 { +public: + __device__ uint128(uint64_t high, uint64_t low) : hi_(high), lo_(low) {} + + uint64_t lo_; + uint64_t hi_; +}; + +class int128 { +public: + int128() = default; + + __device__ operator unsigned long long() const { + return static_cast(lo_); + } + + __device__ int128(int64_t high, uint64_t low) : hi_(high), lo_(low) {} + + uint64_t lo_; + int64_t hi_; +}; + +__device__ inline uint128 make_uint128(uint64_t high, uint64_t low) { + return uint128(high, low); +} + +template __device__ uint128 make_uint128_from_float(T v) { + if (v >= ldexp(static_cast(1), 64)) { + uint64_t hi = static_cast(ldexp(v, -64)); + uint64_t lo = static_cast(v - ldexp(static_cast(hi), 64)); + return make_uint128(hi, lo); + } + + return make_uint128(0, static_cast(v)); +} + +__device__ inline int128 make_int128(int64_t high, uint64_t low) { + return int128(high, low); +} + +__device__ inline int64_t bitcast_to_signed(uint64_t v) { + return v & (uint64_t{1} << 63) ? ~static_cast(~v) + : static_cast(v); +} + +__device__ inline uint64_t uint128_high64(uint128 v) { return v.hi_; } +__device__ inline uint64_t uint128_low64(uint128 v) { return v.lo_; } + +__device__ __forceinline__ uint128 operator-(uint128 val) { + uint64_t hi = ~uint128_high64(val); + uint64_t lo = ~uint128_low64(val) + 1; + if (lo == 0) + ++hi; // carry + return make_uint128(hi, lo); +} + +template __device__ int128 make_int128_from_float(T v) { + + // We must convert the absolute value and then negate as needed, because + // floating point types are typically sign-magnitude. Otherwise, the + // difference between the high and low 64 bits when interpreted as two's + // complement overwhelms the precision of the mantissa. + uint128 result = + v < 0 ? -make_uint128_from_float(-v) : make_uint128_from_float(v); + + return make_int128(bitcast_to_signed(uint128_high64(result)), + uint128_low64(result)); +} + +#endif \ No newline at end of file diff --git a/src/utils/kernel_dimensions.cuh b/src/utils/kernel_dimensions.cuh new file mode 100644 index 000000000..afd7e008d --- /dev/null +++ b/src/utils/kernel_dimensions.cuh @@ -0,0 +1,15 @@ +int nextPow2(int x) { + --x; + x |= x >> 1; + x |= x >> 2; + x |= x >> 4; + x |= x >> 8; + x |= x >> 16; + return ++x; +} + +void getNumBlocksAndThreads(const int n, const int maxBlockSize, int &blocks, + int &threads) { + threads = (n < maxBlockSize * 2) ? nextPow2((n + 1) / 2) : maxBlockSize; + blocks = (n + threads - 1) / threads; +} diff --git a/src/utils/memory.cuh b/src/utils/memory.cuh new file mode 100644 index 000000000..88dc500c5 --- /dev/null +++ b/src/utils/memory.cuh @@ -0,0 +1,90 @@ +#ifndef CNCRT_SHMEM_H +#define CNCRT_SHMEM_H + +#include "helper_cuda.h" +#include +#include +#include +#include +#include +#include + +class SharedMemory { +public: + char *m_memory_block; + int m_last_byte; + + __device__ SharedMemory(char *ptr) : m_memory_block(ptr), m_last_byte(0) {} + + template __device__ void get_allocation(T **ptr, int elements) { + *ptr = (T *)(&this->m_memory_block[m_last_byte]); + this->m_last_byte += elements * sizeof(T); + } +}; + +class DeviceMemory { +public: + std::vector> m_allocated; + std::mutex m_allocation_mtx; + std::atomic m_total_devices; + + DeviceMemory() : m_total_devices(1) {} + + __host__ void set_device(int device) { + if (device > m_total_devices) + m_total_devices = device + 1; + } + + template + __host__ void get_allocation(T **ptr, int elements, int device) { + T *res; + cudaMalloc((void **)&res, sizeof(T) * elements); + *ptr = res; + std::lock_guard lock(m_allocation_mtx); + m_allocated.push_back(std::make_tuple(res, device)); + } + + template + __host__ void get_allocation_and_copy_async(T **ptr, T *src, int elements, + int device) { + T *res; + cudaMalloc((void **)&res, sizeof(T) * elements); + cudaMemcpyAsync(res, src, sizeof(T) * elements, cudaMemcpyHostToDevice); + *ptr = res; + std::lock_guard lock(m_allocation_mtx); + m_allocated.push_back(std::make_tuple(res, device)); + } + + template + __host__ void get_allocation_and_copy_async(T **ptr, T *src, int allocation, + int elements, int device) { + T *res; + cudaMalloc((void **)&res, sizeof(T) * allocation); + cudaMemcpyAsync(res, src, sizeof(T) * elements, cudaMemcpyHostToDevice); + *ptr = res; + std::lock_guard lock(m_allocation_mtx); + m_allocated.push_back(std::make_tuple(res, device)); + } + + void free_all_from_device(int device) { + cudaSetDevice(device); + for (auto elem : m_allocated) { + auto dev = std::get<1>(elem); + if (dev == device) { + auto mem = std::get<0>(elem); + checkCudaErrors(cudaFree(mem)); + } + } + } + + __host__ ~DeviceMemory() { + for (auto elem : m_allocated) { + auto dev = std::get<1>(elem); + auto mem = std::get<0>(elem); + cudaSetDevice(dev); + checkCudaErrors(cudaFree(mem)); + } + } +}; + +#endif // CNCRT_SHMEM_H diff --git a/src/utils/timer.cuh b/src/utils/timer.cuh new file mode 100644 index 000000000..e751a2836 --- /dev/null +++ b/src/utils/timer.cuh @@ -0,0 +1,29 @@ +#ifndef CNCRT_TIMER_H +#define CNCRT_TIMER_H + +#define synchronize_threads_in_block() __syncthreads() + +template class CudaMeasureExecution { +public: + cudaEvent_t m_start, m_stop; + + __host__ CudaMeasureExecution() { + if constexpr (active) { + cudaEventCreate(&m_start); + cudaEventCreate(&m_stop); + cudaEventRecord(m_start); + } + } + + __host__ ~CudaMeasureExecution() { + if constexpr (active) { + float ms; + cudaEventRecord(m_stop); + cudaEventSynchronize(m_stop); + cudaEventElapsedTime(&ms, m_start, m_stop); + std::cout << "Execution took " << ms << "ms" << std::endl; + } + } +}; + +#endif // CNCRT_TIMER_H \ No newline at end of file