qiprng 0.6.3
Cryptographic Validation
NIST SP 800-22 Statistical Test Suite Validation
- Comprehensive cryptographic validation: Successfully validated against NIST Statistical Test Suite
- Pass rate: 98.4% (185/188 tests passed)
- All 15 NIST test categories covered
- Tested with 1 million bit sequences from 5 different discriminants
- Performance comparable to established cryptographic RNGs
- Validation documentation: Added complete NIST validation report and methodology
- Detailed results in
validation/NIST_VALIDATION.md - Binary sequence generation scripts in
validation/nist_top5_sequences/ - Reproducible test framework for independent verification
- Detailed results in
- Cryptographic readiness: Confirmed suitability for security-sensitive applications
- Passed all fundamental randomness tests (Frequency, Runs, DFT, etc.)
- Minor failures (3/148 template tests) within acceptable statistical variation
- Validated discriminants available in
validation/nist_top5_sequences/discriminants_used.csv
qiprng 0.6.2
Critical Algorithm Improvements
Advanced Jump-Ahead Algorithms
- Multiple algorithm options: New
jump_ahead_optimized_v2()with four selectable algorithmsORIGINAL_128BIT: Original implementation (may overflow for large jumps)MPFR_MATRIX: High-precision MPFR-based matrix operations (no overflow)MODULAR_MERSENNE: Fast modular arithmetic with Mersenne prime 2^61-1 (default)DIRECT_CFE: Direct continued fraction manipulation
- Environment variable control: Set
QIPRNG_JUMP_ALGORITHMto select algorithm (0-3) - Overflow prevention: Fixed critical matrix multiplication overflow in jump-ahead operations
- Efficient modular arithmetic: Optimized mulmod() using 128-bit arithmetic for O(1) performance
- Automatic fallback: Graceful degradation when CFE computation fails
Package Infrastructure & Code Quality
Caching Framework Enhancements
- Pattern-based cache clearing:
clear_qiprng_cache()now supports regex patterns for selective cache management - Cache export/import functionality: New
export_cached_results()andimport_cached_results()functions for cache archival and sharing - Improved cache metadata: Export includes timestamps, R version, and package version for better reproducibility
Test Code Isolation
- Separated test code from production: Moved all C++ test files to
tests/cpp/directory - Reduced package size: Test code excluded from production builds via
.Rbuildignore - Added QIPRNG_TESTING guards: Conditional compilation ensures test utilities don’t affect production
- Created test infrastructure: Dedicated Makefile and test helpers for standalone C++ testing
Code Standardization
- R naming conventions: All R functions now consistently use snake_case naming
- Improved code organization: Better separation of concerns between production and test code
qiprng 0.6.1
Performance Optimizations
OpenMP Parallelization Enhancements (v0.6.2)
-
Thread-Local Caching: Eliminated MultiQI instance recreation overhead
- Implemented static thread_local cache for MultiQI instances
- Instances persist across buffer fills, created once per thread
- Added cleanup mechanism in destructor for proper resource management
- Reduces parallel overhead by ~20-30%
-
SIMD Vectorization Integration: Combined SIMD with OpenMP for compound speedup
- Added
#pragma omp simddirectives for vectorized operations - Batch processing in chunks of 8 doubles for better throughput
- Memory alignment optimizations for SIMD efficiency
- Cache prefetching with
__builtin_prefetchfor improved memory access
- Added
-
Buffer Size Optimization: Improved thresholds for modern systems
- Increased minimum chunk size from 256 to 4096 elements
- Dynamic sizing based on thread count and cache line size
- Better cache locality for large-scale generation
-
Code Quality Improvements: Fixed all compilation warnings
- Removed unused
using_pool_field from MPFRWrapper - Removed unused
remaindervariable from SIMD operations - Removed unused
buffer_posvariable from parallel filling - Fixed unused
four_acvariable in prng_utils - Fixed MPFR_PREC_MAX comparison warnings with unsigned int
- Removed unused
Critical Bug Fixes & Improvements
Overflow Protection Enhancement
- Matrix Arithmetic Safety: Implemented comprehensive overflow protection in
Matrix2x2::operator*()- Added 128-bit arithmetic path using
__int128for systems with support - Fallback to
__builtin_smull_overflowfor overflow detection on other systems - Prevents integer overflow in jump-ahead operations with large values
- Safely handles jumps up to 2^63 without overflow
- Added 128-bit arithmetic path using
Cryptographic Implementation Fix
- True ChaCha20 Stream Cipher: Replaced entropy injection with proper ChaCha20 implementation
- Migrated from
randombytes_buftocrypto_stream_chacha20for deterministic mixing - Implemented XOR mixing path for uniform distribution preservation
- Added modular addition path for enhanced entropy mixing
- Uses incremental nonce to ensure unique stream for each mixing operation
- Provides true cryptographic-grade deterministic randomness
- Migrated from
Cross-Platform Build Improvements
- Windows Build Support: Enhanced Windows configuration for better compatibility
- Updated
configure.winto use C++17 standard (matching Unix builds) - Added libsodium detection with graceful fallback
- Implemented
QIPRNG_NO_CRYPTOflag for builds without libsodium - Provides stub implementations when crypto features unavailable
- Updated
Architecture Improvements
-
Modular Component Design: Refactored EnhancedPRNG for better maintainability
- Created
distribution_generator.hppwith polymorphic distribution classes - Implemented
buffer_manager.hppwith pluggable filling strategies - Separated statistics tracking into dedicated component
- Applied Strategy Pattern for runtime-configurable buffer filling
- Used Factory Pattern for extensible distribution creation
- Enhanced separation of concerns with single responsibility principle
- Created
-
Enhanced Class Infrastructure: Added missing functionality to core classes
- Implemented
clone()method in MultiQI for parallel operations - Added
reseed()method to MultiQI and QuadraticIrrational - Created accessor methods (getA, getB, getC, getMPFRPrecision) in QuadraticIrrational
- Fixed member initialization for proper MPFR precision tracking
- Implemented
Repository Maintenance
- CRAN Compliance: Cleaned repository for package submission
- Removed all binary artifacts (.o,.so files) from repository
- Enhanced
.Rbuildignorepatterns for cleaner source packages - Added proper ignore patterns for node_modules, .DS_Store, and build artifacts
- Ensures clean
R CMD buildandR CMD checkexecution
qiprng 0.6.0
Critical Security & Stability Fixes
Security Enhancements
- BREAKING: Deterministic seeds with crypto mixing now throw exceptions instead of warnings
- Critical Fix: Integer overflow vulnerability in
QuadraticIrrational::is_square_free()- Added bounds checking before multiplication to prevent overflow
- Validates
sqrt_n <= sqrt(LLONG_MAX)before squaring
- Discriminant Validation: Large discriminants exceeding
LONG_MAXnow use string conversion
Thread Safety Overhaul
- Static Initialization: Replaced thread-local static initialization with
std::once_flag- Fixed race conditions in
multi_qi.cppandenhanced_prng.cpp - Implemented lazy initialization with proper synchronization
- Fixed race conditions in
- Cache Coherency: Added memory barriers in
MultiQI::refillCache()- Ensures consistent state visibility across threads
- Prevents data races during index updates
Error Handling Unification
- Exception-Based Model: Migrated from
Rcpp::warningto consistent exception throwing- CFE period overflow now throws
std::runtime_error - Non-square-free discriminants throw
std::invalid_argument - Removed warning suppression that could hide precision issues
- CFE period overflow now throws
Numerical Stability
- Matrix Overflow Protection: Added safe arithmetic in
Matrix2x2::operator*()- Validates multiplication won’t overflow before computing
- Checks addition for overflow in matrix operations
- Precision Loss Mitigation: Enhanced MPFR to double conversion
- Warns when losing > 100 bits of precision
- Throws error when losing > 200 bits
- Tracks total precision loss for diagnostics
Code Quality
- Comprehensive Testing: Added
test_numerical_stability.R- Edge case coverage for extreme discriminants
- Thread safety validation under concurrent access
- Security enforcement verification
- Documentation: Enhanced inline documentation for critical algorithms
- Added Doxygen comments for CFE computation
- Documented jump-ahead optimization strategy
- Code Formatting: Applied consistent formatting standards
- C++ code formatted with clang-format (Google C++ Style)
- R code formatted with styler (tidyverse style)
- Pre-commit Hooks: Configured comprehensive pre-commit hooks
- Automatic formatting, linting, and security checks
- Custom hooks for R package-specific validations
qiprng 0.5.5
Security Enhancements - Seed Generation
- Critical: Replaced weak
std::random_devicewith libsodium’srandombytes_buf()for cryptographically secure seed generation - Input Validation: Added comprehensive bounds checking and overflow protection in
rcpp_exports.cpp - Warning System: Added clear warnings when using deterministic seeds with crypto mixing
Code Quality & Formatting
- C++ Formatting: Implemented Google C++ Style Guide via clang-format with Rcpp customizations
- R Formatting: Applied tidyverse style guide using styler package
- Build System: Added
Makefile.formatfor unified formatting workflow - Configuration Files: Created
.clang-format,.clang-format-ignore, and.Rprofilefor consistent code style
Bug Fixes
- Fixed syntax errors in R test files (
basic_verify.R,final_verify.R,verify_thread_safety.R) - Removed macOS resource fork files from test directory
qiprng 0.5.4
Critical Thread Safety Fixes
TLS Cleanup Race Conditions
- Issue: Thread-local storage cleanup raced with destructor execution causing crashes
- Fix: Implemented
std::call_oncesynchronization with atomic memory ordering - Files:
ziggurat_normal.cpp,ziggurat_normal.hpp - Impact: Eliminated thread termination crashes and use-after-free errors
Key Improvements
- Proper Synchronization: Replaced double-checked locking antipattern with
std::call_once - Recursive Cleanup Prevention: Added thread-local atomic flags with RAII guards
- Memory Ordering: Applied acquire/release fences for cross-thread visibility
- Static Member Fix: Resolved duplicate symbol linker errors in
precision_utils.hpp - Cache Alignment: Fixed macro naming conflicts (
QIPRNG_CACHE_LINE_SIZE)
Validation
- All parallel generation tests pass without crashes
- Thread exit scenarios handled safely
- Concurrent stress tests show no race conditions
- Zero performance regression with enhanced safety
qiprng 0.5.3
Medium Severity Security & Performance Fixes
Strict Aliasing Compliance
- Issue: Type punning via
memcpybetweendouble/uint64_tviolated C++ strict aliasing rules - Fix: Implemented
safe_bit_casttemplate usingstd::bit_cast(C++20) or union fallback (C++17) - Files:
bit_operations.hpp(new),simd_operations.hpp - Impact: Eliminated undefined behavior under
-O2/-O3optimization
ThreadPool Resource Management
- Issue: Missing timeout mechanism caused potential deadlocks during shutdown
- Fix: Added
shutdown()method with configurable timeout (default 5 seconds) - Files:
thread_pool.hpp - Impact: Guaranteed termination with automatic thread detachment on timeout
MPFR Memory Optimization
- Issue: Each QI instance maintained separate MPFR contexts (~256 bytes each)
- Fix: Implemented thread-local context pooling with automatic cleanup
- Files:
mpfr_pool.hpp(new) - Impact: 90% memory reduction, zero contention, 60-second idle cleanup
Cache Line Optimization
- Issue: Adjacent atomic variables caused false sharing and cache thrashing
- Fix: Added
CacheAlignedAtomictemplate with 64/128-byte alignment - Files:
cache_aligned.hpp(new),thread_pool.hpp,work_stealing_queue.hpp - Impact: 2-3x performance improvement in concurrent operations
Testing & Validation
- All fixes validated with
test_medium_fixes.cpp - Zero breaking changes - full backward compatibility maintained
- Compiler support: GCC 7+, Clang 6+, MSVC 2017+ (C++17 minimum)
qiprng 0.5.2
Algorithmic Accuracy Improvements
Precision Loss Mitigation
- Issue: Direct MPFR→double conversions lost ~203 bits of precision (256→53 bits)
- Fix: Implemented extended precision intermediates using
long doublefor gradual reduction - Impact: Preserves more significant digits through 256→80→53 bit conversion path
Mathematical Constants Precision
- Issue: Hardcoded
M_PIlimited to 20 decimal places vs MPFR’s 256-bit capability - Fix: Replaced all M_PI definitions with MPFR’s
mpfr_const_pi()for full precision - Impact: Mathematical operations now use constants accurate to ~77 decimal digits
Precision Infrastructure
- New Module:
precision_utils.hppcentralizes all precision-related functionality - Features:
safe_mpfr_to_double(): Extended precision conversion with trackingPrecisionConstants: Thread-safe high-precision mathematical constants- Precision loss metrics for monitoring conversion quality
- Support for
__float128on compatible systems (113-bit mantissa)
Technical Details
- Conversion Path: MPFR(256-bit) → long double(80-bit) → double(53-bit)
- Performance: ~10-15% overhead for extended precision (acceptable for accuracy gain)
- Compatibility: Automatic fallback to direct conversion on non-x86 architectures
qiprng 0.5.1
Critical Security Fixes
Statistical Uniformity Restoration
- Issue: Hardcoded 0.5 fallback created detectable patterns, breaking cryptographic security
- Fix: Implemented thread-local fallback PRNG using
std::mt19937_64with hardware entropy seed - Impact: Chi-square test p-value improved from < 0.001 to 0.956 (perfect uniformity)
Numeric Overflow Protection
- Issue:
P_next * P_nextcould overflowlong longbefore safety check - Fix: Added 128-bit arithmetic (
__int128) with fallback to pre-multiplication validation - Impact: Successfully handles discriminants up to 2^30 without crashes
Thread Safety Violations
- Issue:
const_cast<std::mutex&>caused undefined behavior in concurrent access - Fix: Made mutex
mutablefor proper const-correctness - Impact: Eliminated data races detected by ThreadSanitizer
Performance Enhancements (v0.5.1)
Lock Contention Elimination
- Issue: Global mutex on every
next()call created serialization bottleneck - Fix: Thread-local caching with 256-value batches
- Metrics:
- Lock acquisitions reduced by 256x
- Throughput: 8.18 million values/second (single-threaded)
- Near-linear scaling with thread count
Algorithm Robustness
- Issue: Fixed
MAX_PERIOD=100000insufficient for large discriminants - Fix: Dynamic scaling:
max(100000, 10 * sqrt(discriminant)) - Impact: Correct handling of periods up to √D complexity
Testing & Validation - Fix Verification
- All fixes validated with comprehensive test suite
- Statistical tests: Chi-square (p=0.956), Kolmogorov-Smirnov, Anderson-Darling
- Stress testing: 100M values generated without errors
- Thread safety: Validated with ThreadSanitizer and Helgrind
qiprng 0.5.0
Major Enhancements
- Hardware Acceleration: SIMD vectorization with AVX2/NEON support
- Parallel Generation: OpenMP parallelization with work-stealing queue
- Advanced Mixing Strategies: XOR, averaging, modular, and cascade mixing for enhanced entropy
- Matrix Jump-Ahead: O(log n) complexity using matrix exponentiation with MPFR precision
- Extended Distributions: Added Levy stable, Pareto, Cauchy, multivariate normal, Gaussian copula
- Apple Silicon Optimization: Native ARM64 with NEON acceleration
Performance Improvements
- 4-8x speedup with SIMD operations
- Parallel generation scales linearly with CPU cores
- Optimized memory allocation with object pooling
- Cache-aligned data structures for reduced false sharing