From b698a52f6c8685c5715fb513a56c32f2a3135556 Mon Sep 17 00:00:00 2001 From: Nathan Vegdahl Date: Thu, 11 May 2017 22:57:59 -0700 Subject: [PATCH] Split some more things out into sub-crates. Also translated the Halton generator to rust and made it a crate where the code is generated by a build.rs file. --- Cargo.lock | 40 +- Cargo.toml | 10 +- src/accel/objects_split.rs | 3 +- src/{color/mod.rs => color.rs} | 6 +- src/main.rs | 2 + src/renderer.rs | 4 +- src/sampling/halton.py | 186 --- src/sampling/halton.rs | 1387 ----------------- src/sampling/mod.rs | 1 - sub_crates/halton/Cargo.toml | 10 + sub_crates/halton/build.rs | 272 ++++ sub_crates/halton/src/lib.rs | 4 + .../mem_arena}/Cargo.toml | 0 .../mem_arena}/src/lib.rs | 0 sub_crates/spectra_xyz/Cargo.toml | 9 + .../spectra_xyz/src}/generate_spectra_rust.py | 0 .../spectra_xyz/src/lib.rs | 0 .../spectra_xyz/src}/xyz_5nm_360_830.csv | 0 .../spectra_xyz/src}/xyz_5nm_380_780.csv | 0 19 files changed, 337 insertions(+), 1597 deletions(-) rename src/{color/mod.rs => color.rs} (99%) delete mode 100644 src/sampling/halton.py delete mode 100644 src/sampling/halton.rs create mode 100644 sub_crates/halton/Cargo.toml create mode 100644 sub_crates/halton/build.rs create mode 100644 sub_crates/halton/src/lib.rs rename {mem_arena => sub_crates/mem_arena}/Cargo.toml (100%) rename {mem_arena => sub_crates/mem_arena}/src/lib.rs (100%) create mode 100644 sub_crates/spectra_xyz/Cargo.toml rename {src/color => sub_crates/spectra_xyz/src}/generate_spectra_rust.py (100%) rename src/color/spectra_xyz.rs => sub_crates/spectra_xyz/src/lib.rs (100%) rename {src/color => sub_crates/spectra_xyz/src}/xyz_5nm_360_830.csv (100%) rename {src/color => sub_crates/spectra_xyz/src}/xyz_5nm_380_780.csv (100%) diff --git a/Cargo.lock b/Cargo.lock index 8b64f01..07aecff 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,20 +1,6 @@ [root] -name = "psychopath" +name = "spectra_xyz" version = "0.1.0" -dependencies = [ - "clap 2.23.2 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "lodepng 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "mem_arena 0.1.0", - "nom 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "openexr 0.1.0 (git+https://github.com/cessen/openexr-rs?rev=612fc6c81c031970ffddcab15509236711613de8)", - "rustc-serialize 0.3.23 (registry+https://github.com/rust-lang/crates.io-index)", - "scoped_threadpool 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "simd 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "time 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)", -] [[package]] name = "ansi_term" @@ -74,6 +60,10 @@ name = "gcc" version = "0.3.45" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "halton" +version = "0.1.0" + [[package]] name = "kernel32-sys" version = "0.2.2" @@ -145,6 +135,26 @@ name = "pkg-config" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "psychopath" +version = "0.1.0" +dependencies = [ + "clap 2.23.2 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "halton 0.1.0", + "lazy_static 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "lodepng 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "mem_arena 0.1.0", + "nom 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "openexr 0.1.0 (git+https://github.com/cessen/openexr-rs?rev=612fc6c81c031970ffddcab15509236711613de8)", + "rustc-serialize 0.3.23 (registry+https://github.com/rust-lang/crates.io-index)", + "scoped_threadpool 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "simd 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "spectra_xyz 0.1.0", + "time 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "redox_syscall" version = "0.1.17" diff --git a/Cargo.toml b/Cargo.toml index 78352f1..dda62f5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ [workspace] -members = ["mem_arena"] +members = ["sub_crates/mem_arena", "sub_crates/halton", "sub_crates/spectra_xyz"] [package] name = "psychopath" @@ -29,5 +29,11 @@ simd = { version = "0.2.0", optional = true } openexr = { git = "https://github.com/cessen/openexr-rs", rev = "612fc6c81c031970ffddcab15509236711613de8" } # Local crate dependencies +[dependencies.halton] +path = "sub_crates/halton" + [dependencies.mem_arena] -path = "mem_arena" \ No newline at end of file +path = "sub_crates/mem_arena" + +[dependencies.spectra_xyz] +path = "sub_crates/spectra_xyz" \ No newline at end of file diff --git a/src/accel/objects_split.rs b/src/accel/objects_split.rs index fcd0029..bc970f1 100644 --- a/src/accel/objects_split.rs +++ b/src/accel/objects_split.rs @@ -3,11 +3,12 @@ use std; use std::cmp::Ordering; +use halton; + use algorithm::{partition, quick_select}; use bbox::BBox; use lerp::lerp_slice; use math::{Vector, dot}; -use sampling::halton; use sampling::uniform_sample_hemisphere; diff --git a/src/color/mod.rs b/src/color.rs similarity index 99% rename from src/color/mod.rs rename to src/color.rs index ac31683..96d6fbc 100644 --- a/src/color/mod.rs +++ b/src/color.rs @@ -1,13 +1,11 @@ -mod spectra_xyz; - use std::ops::{Add, AddAssign, Mul, MulAssign, Div, DivAssign}; +use spectra_xyz::{spectrum_xyz_to_p, EQUAL_ENERGY_REFLECTANCE}; + use float4::Float4; use lerp::Lerp; use math::faster_exp; -use self::spectra_xyz::{spectrum_xyz_to_p, EQUAL_ENERGY_REFLECTANCE}; - // Minimum and maximum wavelength of light we care about, in nanometers const WL_MIN: f32 = 380.0; diff --git a/src/main.rs b/src/main.rs index 1215095..b424f10 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,6 @@ +extern crate halton; extern crate mem_arena; +extern crate spectra_xyz; extern crate crossbeam; extern crate clap; diff --git a/src/renderer.rs b/src/renderer.rs index 9b80b61..d1a8f4d 100644 --- a/src/renderer.rs +++ b/src/renderer.rs @@ -8,6 +8,8 @@ use std::sync::{RwLock, Mutex}; use crossbeam::sync::MsQueue; use scoped_threadpool::Pool; +use halton; + use algorithm::partition_pair; use accel::ACCEL_TRAV_TIME; use color::{Color, XYZ, SpectralSample, map_0_1_to_wavelength}; @@ -17,7 +19,6 @@ use hilbert; use image::Image; use math::{fast_logit, upper_power_of_two}; use ray::Ray; -use sampling::halton; use scene::Scene; use surface; use timer::Timer; @@ -158,6 +159,7 @@ impl<'a> Renderer<'a> { halton::sample(1, offset + si as u32)), halton::sample(2, offset + si as u32), map_0_1_to_wavelength(halton::sample(3, + offset + si as u32)), diff --git a/src/sampling/halton.py b/src/sampling/halton.py deleted file mode 100644 index 82137c3..0000000 --- a/src/sampling/halton.py +++ /dev/null @@ -1,186 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2012 Leonhard Gruenschloss (leonhard@gruenschloss.org) -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights to -# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -# of the Software, and to permit persons to whom the Software is furnished to do -# so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -# Adapted to generate Rust instead of C by Nathan Vegdahl -# Generate Rust code for evaluating Halton points with Faure-permutations for different bases. - -# How many components to generate. -num_dimensions = 128 - -# Check primality. Not optimized, since it's not performance-critical. -def is_prime(p): - for i in range(2, p): - if not p % i: - return False - return True - -# Init prime number array. -primes = [] -candidate = 1 -for i in range(num_dimensions): - while (True): - candidate += 1 - if (is_prime(candidate)): - break; - primes.append(candidate) - -# Compute the Faure digit permutation for 0, ..., b - 1. -def get_faure_permutation(b): - if b < 2: - return (0,) - - elif b == 2: - return (0, 1) - - elif b & 1: # odd - c = (b - 1) / 2 - - def faure_odd(i): - if i == c: - return c - - f = faure[b - 1][i - int(i > c)] - return f + int(f >= c) - - return tuple((faure_odd(i) for i in range(b))) - - else: # even - c = b / 2 - - def faure_even(i): - if i < c: - return 2 * faure[c][i] - else: - return 2 * faure[c][i - c] + 1 - - return tuple((faure_even(i) for i in range(b))) - -# Init Faure permutations. -faure = [] -for b in range(primes[-1] + 1): - faure.append(get_faure_permutation(b)) - -# Compute the radical inverse with Faure permutations. -def invert(base, index, digits): - result = 0 - for i in range(digits): - index, remainder = divmod(index, base) - result = result * base + faure[base][remainder] - return result - -# Print the beginning bits of the file -print '''#![allow(dead_code)] -#![cfg_attr(rustfmt, rustfmt_skip)] -// Copyright (c) 2012 Leonhard Gruenschloss (leonhard@gruenschloss.org) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights to -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -// of the Software, and to permit persons to whom the Software is furnished to do -// so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. - -// This file is automatically generated. - -// Compute points of the Halton sequence with with Faure-permutations for different bases. - -pub const MAX_DIMENSION: u32 = %d;''' % num_dimensions - -# Print the sampling function -print ''' -pub fn sample(dimension: u32, index: u32) -> f32 { - match dimension {''' - -for i in range(num_dimensions): - print ' %d => halton%d(index),' % (i, primes[i]) - -print ''' - _ => panic!("Exceeded max dimensions."), - } -} -''' - -# Print the special-cased first dimension -print ''' -// Special case: radical inverse in base 2, with direct bit reversal. -fn halton2(mut index: u32) -> f32 { - index = (index << 16) | (index >> 16); - index = ((index & 0x00ff00ff) << 8) | ((index & 0xff00ff00) >> 8); - index = ((index & 0x0f0f0f0f) << 4) | ((index & 0xf0f0f0f0) >> 4); - index = ((index & 0x33333333) << 2) | ((index & 0xcccccccc) >> 2); - index = ((index & 0x55555555) << 1) | ((index & 0xaaaaaaaa) >> 1); - return (index as f32) * (1.0 / ((1u64 << 32) as f32)); -} -''' - -for i in range(1, num_dimensions): # Skip base 2. - base = primes[i] - - # Based on the permutation table size, we process multiple digits at once. - digits = 1 - pow_base = base - while pow_base * base <= 500: # Maximum permutation table size. - pow_base *= base - digits += 1 - - max_power = pow_base - powers = [] - while max_power * pow_base < (1 << 32): # 32-bit unsigned precision - powers.append(max_power) - max_power *= pow_base - - # Build the permutation table. - perm = [] - for j in range(pow_base): - perm.append(invert(base, j, digits)) - - power = max_power / pow_base - print ''' -fn halton%d(index: u32) -> f32 { - const PERM%d: [u16; %d] = [%s]; - ''' % (base, base, len(perm), ', '.join(str(k) for k in perm)) - - print ''' return (unsafe{*PERM%d.get_unchecked((index %% %d) as usize)} as u32 * %d +''' % \ - (base, pow_base, power) - - # Advance to next set of digits. - div = 1 - while power / pow_base > 1: - div *= pow_base - power /= pow_base - print ' unsafe{*PERM%d.get_unchecked(((index / %d) %% %d) as usize)} as u32 * %d +' % (base, div, pow_base, power) - - print ''' unsafe{*PERM%d.get_unchecked(((index / %d) %% %d) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (%du32 as f32)); // Results in [0,1). -} -''' % (base, div * pow_base, pow_base, max_power) - diff --git a/src/sampling/halton.rs b/src/sampling/halton.rs deleted file mode 100644 index 21cbc7e..0000000 --- a/src/sampling/halton.rs +++ /dev/null @@ -1,1387 +0,0 @@ -#![allow(dead_code)] -#![cfg_attr(rustfmt, rustfmt_skip)] -// Copyright (c) 2012 Leonhard Gruenschloss (leonhard@gruenschloss.org) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights to -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -// of the Software, and to permit persons to whom the Software is furnished to do -// so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. - -// This file is automatically generated. - -// Compute points of the Halton sequence with with Faure-permutations for different bases. - -pub const MAX_DIMENSION: u32 = 128; - -pub fn sample(dimension: u32, index: u32) -> f32 { - match dimension { - 0 => halton2(index), - 1 => halton3(index), - 2 => halton5(index), - 3 => halton7(index), - 4 => halton11(index), - 5 => halton13(index), - 6 => halton17(index), - 7 => halton19(index), - 8 => halton23(index), - 9 => halton29(index), - 10 => halton31(index), - 11 => halton37(index), - 12 => halton41(index), - 13 => halton43(index), - 14 => halton47(index), - 15 => halton53(index), - 16 => halton59(index), - 17 => halton61(index), - 18 => halton67(index), - 19 => halton71(index), - 20 => halton73(index), - 21 => halton79(index), - 22 => halton83(index), - 23 => halton89(index), - 24 => halton97(index), - 25 => halton101(index), - 26 => halton103(index), - 27 => halton107(index), - 28 => halton109(index), - 29 => halton113(index), - 30 => halton127(index), - 31 => halton131(index), - 32 => halton137(index), - 33 => halton139(index), - 34 => halton149(index), - 35 => halton151(index), - 36 => halton157(index), - 37 => halton163(index), - 38 => halton167(index), - 39 => halton173(index), - 40 => halton179(index), - 41 => halton181(index), - 42 => halton191(index), - 43 => halton193(index), - 44 => halton197(index), - 45 => halton199(index), - 46 => halton211(index), - 47 => halton223(index), - 48 => halton227(index), - 49 => halton229(index), - 50 => halton233(index), - 51 => halton239(index), - 52 => halton241(index), - 53 => halton251(index), - 54 => halton257(index), - 55 => halton263(index), - 56 => halton269(index), - 57 => halton271(index), - 58 => halton277(index), - 59 => halton281(index), - 60 => halton283(index), - 61 => halton293(index), - 62 => halton307(index), - 63 => halton311(index), - 64 => halton313(index), - 65 => halton317(index), - 66 => halton331(index), - 67 => halton337(index), - 68 => halton347(index), - 69 => halton349(index), - 70 => halton353(index), - 71 => halton359(index), - 72 => halton367(index), - 73 => halton373(index), - 74 => halton379(index), - 75 => halton383(index), - 76 => halton389(index), - 77 => halton397(index), - 78 => halton401(index), - 79 => halton409(index), - 80 => halton419(index), - 81 => halton421(index), - 82 => halton431(index), - 83 => halton433(index), - 84 => halton439(index), - 85 => halton443(index), - 86 => halton449(index), - 87 => halton457(index), - 88 => halton461(index), - 89 => halton463(index), - 90 => halton467(index), - 91 => halton479(index), - 92 => halton487(index), - 93 => halton491(index), - 94 => halton499(index), - 95 => halton503(index), - 96 => halton509(index), - 97 => halton521(index), - 98 => halton523(index), - 99 => halton541(index), - 100 => halton547(index), - 101 => halton557(index), - 102 => halton563(index), - 103 => halton569(index), - 104 => halton571(index), - 105 => halton577(index), - 106 => halton587(index), - 107 => halton593(index), - 108 => halton599(index), - 109 => halton601(index), - 110 => halton607(index), - 111 => halton613(index), - 112 => halton617(index), - 113 => halton619(index), - 114 => halton631(index), - 115 => halton641(index), - 116 => halton643(index), - 117 => halton647(index), - 118 => halton653(index), - 119 => halton659(index), - 120 => halton661(index), - 121 => halton673(index), - 122 => halton677(index), - 123 => halton683(index), - 124 => halton691(index), - 125 => halton701(index), - 126 => halton709(index), - 127 => halton719(index), - - _ => panic!("Exceeded max dimensions."), - } -} - - -// Special case: radical inverse in base 2, with direct bit reversal. -fn halton2(mut index: u32) -> f32 { - index = (index << 16) | (index >> 16); - index = ((index & 0x00ff00ff) << 8) | ((index & 0xff00ff00) >> 8); - index = ((index & 0x0f0f0f0f) << 4) | ((index & 0xf0f0f0f0) >> 4); - index = ((index & 0x33333333) << 2) | ((index & 0xcccccccc) >> 2); - index = ((index & 0x55555555) << 1) | ((index & 0xaaaaaaaa) >> 1); - return (index as f32) * (1.0 / ((1u64 << 32) as f32)); -} - - -fn halton3(index: u32) -> f32 { - const PERM3: [u16; 243] = [0, 81, 162, 27, 108, 189, 54, 135, 216, 9, 90, 171, 36, 117, 198, 63, 144, 225, 18, 99, 180, 45, 126, 207, 72, 153, 234, 3, 84, 165, 30, 111, 192, 57, 138, 219, 12, 93, 174, 39, 120, 201, 66, 147, 228, 21, 102, 183, 48, 129, 210, 75, 156, 237, 6, 87, 168, 33, 114, 195, 60, 141, 222, 15, 96, 177, 42, 123, 204, 69, 150, 231, 24, 105, 186, 51, 132, 213, 78, 159, 240, 1, 82, 163, 28, 109, 190, 55, 136, 217, 10, 91, 172, 37, 118, 199, 64, 145, 226, 19, 100, 181, 46, 127, 208, 73, 154, 235, 4, 85, 166, 31, 112, 193, 58, 139, 220, 13, 94, 175, 40, 121, 202, 67, 148, 229, 22, 103, 184, 49, 130, 211, 76, 157, 238, 7, 88, 169, 34, 115, 196, 61, 142, 223, 16, 97, 178, 43, 124, 205, 70, 151, 232, 25, 106, 187, 52, 133, 214, 79, 160, 241, 2, 83, 164, 29, 110, 191, 56, 137, 218, 11, 92, 173, 38, 119, 200, 65, 146, 227, 20, 101, 182, 47, 128, 209, 74, 155, 236, 5, 86, 167, 32, 113, 194, 59, 140, 221, 14, 95, 176, 41, 122, 203, 68, 149, 230, 23, 104, 185, 50, 131, 212, 77, 158, 239, 8, 89, 170, 35, 116, 197, 62, 143, 224, 17, 98, 179, 44, 125, 206, 71, 152, 233, 26, 107, 188, 53, 134, 215, 80, 161, 242]; - - return (unsafe{*PERM3.get_unchecked((index % 243) as usize)} as u32 * 14348907 + - unsafe{*PERM3.get_unchecked(((index / 243) % 243) as usize)} as u32 * 59049 + - unsafe{*PERM3.get_unchecked(((index / 59049) % 243) as usize)} as u32 * 243 + - unsafe{*PERM3.get_unchecked(((index / 14348907) % 243) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (3486784401u32 as f32)); // Results in [0,1). -} - - -fn halton5(index: u32) -> f32 { - const PERM5: [u16; 125] = [0, 75, 50, 25, 100, 15, 90, 65, 40, 115, 10, 85, 60, 35, 110, 5, 80, 55, 30, 105, 20, 95, 70, 45, 120, 3, 78, 53, 28, 103, 18, 93, 68, 43, 118, 13, 88, 63, 38, 113, 8, 83, 58, 33, 108, 23, 98, 73, 48, 123, 2, 77, 52, 27, 102, 17, 92, 67, 42, 117, 12, 87, 62, 37, 112, 7, 82, 57, 32, 107, 22, 97, 72, 47, 122, 1, 76, 51, 26, 101, 16, 91, 66, 41, 116, 11, 86, 61, 36, 111, 6, 81, 56, 31, 106, 21, 96, 71, 46, 121, 4, 79, 54, 29, 104, 19, 94, 69, 44, 119, 14, 89, 64, 39, 114, 9, 84, 59, 34, 109, 24, 99, 74, 49, 124]; - - return (unsafe{*PERM5.get_unchecked((index % 125) as usize)} as u32 * 1953125 + - unsafe{*PERM5.get_unchecked(((index / 125) % 125) as usize)} as u32 * 15625 + - unsafe{*PERM5.get_unchecked(((index / 15625) % 125) as usize)} as u32 * 125 + - unsafe{*PERM5.get_unchecked(((index / 1953125) % 125) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (244140625u32 as f32)); // Results in [0,1). -} - - -fn halton7(index: u32) -> f32 { - const PERM7: [u16; 343] = [0, 98, 245, 147, 49, 196, 294, 14, 112, 259, 161, 63, 210, 308, 35, 133, 280, 182, 84, 231, 329, 21, 119, 266, 168, 70, 217, 315, 7, 105, 252, 154, 56, 203, 301, 28, 126, 273, 175, 77, 224, 322, 42, 140, 287, 189, 91, 238, 336, 2, 100, 247, 149, 51, 198, 296, 16, 114, 261, 163, 65, 212, 310, 37, 135, 282, 184, 86, 233, 331, 23, 121, 268, 170, 72, 219, 317, 9, 107, 254, 156, 58, 205, 303, 30, 128, 275, 177, 79, 226, 324, 44, 142, 289, 191, 93, 240, 338, 5, 103, 250, 152, 54, 201, 299, 19, 117, 264, 166, 68, 215, 313, 40, 138, 285, 187, 89, 236, 334, 26, 124, 271, 173, 75, 222, 320, 12, 110, 257, 159, 61, 208, 306, 33, 131, 278, 180, 82, 229, 327, 47, 145, 292, 194, 96, 243, 341, 3, 101, 248, 150, 52, 199, 297, 17, 115, 262, 164, 66, 213, 311, 38, 136, 283, 185, 87, 234, 332, 24, 122, 269, 171, 73, 220, 318, 10, 108, 255, 157, 59, 206, 304, 31, 129, 276, 178, 80, 227, 325, 45, 143, 290, 192, 94, 241, 339, 1, 99, 246, 148, 50, 197, 295, 15, 113, 260, 162, 64, 211, 309, 36, 134, 281, 183, 85, 232, 330, 22, 120, 267, 169, 71, 218, 316, 8, 106, 253, 155, 57, 204, 302, 29, 127, 274, 176, 78, 225, 323, 43, 141, 288, 190, 92, 239, 337, 4, 102, 249, 151, 53, 200, 298, 18, 116, 263, 165, 67, 214, 312, 39, 137, 284, 186, 88, 235, 333, 25, 123, 270, 172, 74, 221, 319, 11, 109, 256, 158, 60, 207, 305, 32, 130, 277, 179, 81, 228, 326, 46, 144, 291, 193, 95, 242, 340, 6, 104, 251, 153, 55, 202, 300, 20, 118, 265, 167, 69, 216, 314, 41, 139, 286, 188, 90, 237, 335, 27, 125, 272, 174, 76, 223, 321, 13, 111, 258, 160, 62, 209, 307, 34, 132, 279, 181, 83, 230, 328, 48, 146, 293, 195, 97, 244, 342]; - - return (unsafe{*PERM7.get_unchecked((index % 343) as usize)} as u32 * 117649 + - unsafe{*PERM7.get_unchecked(((index / 343) % 343) as usize)} as u32 * 343 + - unsafe{*PERM7.get_unchecked(((index / 117649) % 343) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (40353607u32 as f32)); // Results in [0,1). -} - - -fn halton11(index: u32) -> f32 { - const PERM11: [u16; 121] = [0, 77, 44, 22, 99, 55, 11, 88, 66, 33, 110, 7, 84, 51, 29, 106, 62, 18, 95, 73, 40, 117, 4, 81, 48, 26, 103, 59, 15, 92, 70, 37, 114, 2, 79, 46, 24, 101, 57, 13, 90, 68, 35, 112, 9, 86, 53, 31, 108, 64, 20, 97, 75, 42, 119, 5, 82, 49, 27, 104, 60, 16, 93, 71, 38, 115, 1, 78, 45, 23, 100, 56, 12, 89, 67, 34, 111, 8, 85, 52, 30, 107, 63, 19, 96, 74, 41, 118, 6, 83, 50, 28, 105, 61, 17, 94, 72, 39, 116, 3, 80, 47, 25, 102, 58, 14, 91, 69, 36, 113, 10, 87, 54, 32, 109, 65, 21, 98, 76, 43, 120]; - - return (unsafe{*PERM11.get_unchecked((index % 121) as usize)} as u32 * 1771561 + - unsafe{*PERM11.get_unchecked(((index / 121) % 121) as usize)} as u32 * 14641 + - unsafe{*PERM11.get_unchecked(((index / 14641) % 121) as usize)} as u32 * 121 + - unsafe{*PERM11.get_unchecked(((index / 1771561) % 121) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (214358881u32 as f32)); // Results in [0,1). -} - - -fn halton13(index: u32) -> f32 { - const PERM13: [u16; 169] = [0, 52, 117, 26, 91, 143, 78, 13, 65, 130, 39, 104, 156, 4, 56, 121, 30, 95, 147, 82, 17, 69, 134, 43, 108, 160, 9, 61, 126, 35, 100, 152, 87, 22, 74, 139, 48, 113, 165, 2, 54, 119, 28, 93, 145, 80, 15, 67, 132, 41, 106, 158, 7, 59, 124, 33, 98, 150, 85, 20, 72, 137, 46, 111, 163, 11, 63, 128, 37, 102, 154, 89, 24, 76, 141, 50, 115, 167, 6, 58, 123, 32, 97, 149, 84, 19, 71, 136, 45, 110, 162, 1, 53, 118, 27, 92, 144, 79, 14, 66, 131, 40, 105, 157, 5, 57, 122, 31, 96, 148, 83, 18, 70, 135, 44, 109, 161, 10, 62, 127, 36, 101, 153, 88, 23, 75, 140, 49, 114, 166, 3, 55, 120, 29, 94, 146, 81, 16, 68, 133, 42, 107, 159, 8, 60, 125, 34, 99, 151, 86, 21, 73, 138, 47, 112, 164, 12, 64, 129, 38, 103, 155, 90, 25, 77, 142, 51, 116, 168]; - - return (unsafe{*PERM13.get_unchecked((index % 169) as usize)} as u32 * 4826809 + - unsafe{*PERM13.get_unchecked(((index / 169) % 169) as usize)} as u32 * 28561 + - unsafe{*PERM13.get_unchecked(((index / 28561) % 169) as usize)} as u32 * 169 + - unsafe{*PERM13.get_unchecked(((index / 4826809) % 169) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (815730721u32 as f32)); // Results in [0,1). -} - - -fn halton17(index: u32) -> f32 { - const PERM17: [u16; 289] = [0, 153, 68, 221, 34, 187, 102, 255, 136, 17, 170, 85, 238, 51, 204, 119, 272, 9, 162, 77, 230, 43, 196, 111, 264, 145, 26, 179, 94, 247, 60, 213, 128, 281, 4, 157, 72, 225, 38, 191, 106, 259, 140, 21, 174, 89, 242, 55, 208, 123, 276, 13, 166, 81, 234, 47, 200, 115, 268, 149, 30, 183, 98, 251, 64, 217, 132, 285, 2, 155, 70, 223, 36, 189, 104, 257, 138, 19, 172, 87, 240, 53, 206, 121, 274, 11, 164, 79, 232, 45, 198, 113, 266, 147, 28, 181, 96, 249, 62, 215, 130, 283, 6, 159, 74, 227, 40, 193, 108, 261, 142, 23, 176, 91, 244, 57, 210, 125, 278, 15, 168, 83, 236, 49, 202, 117, 270, 151, 32, 185, 100, 253, 66, 219, 134, 287, 8, 161, 76, 229, 42, 195, 110, 263, 144, 25, 178, 93, 246, 59, 212, 127, 280, 1, 154, 69, 222, 35, 188, 103, 256, 137, 18, 171, 86, 239, 52, 205, 120, 273, 10, 163, 78, 231, 44, 197, 112, 265, 146, 27, 180, 95, 248, 61, 214, 129, 282, 5, 158, 73, 226, 39, 192, 107, 260, 141, 22, 175, 90, 243, 56, 209, 124, 277, 14, 167, 82, 235, 48, 201, 116, 269, 150, 31, 184, 99, 252, 65, 218, 133, 286, 3, 156, 71, 224, 37, 190, 105, 258, 139, 20, 173, 88, 241, 54, 207, 122, 275, 12, 165, 80, 233, 46, 199, 114, 267, 148, 29, 182, 97, 250, 63, 216, 131, 284, 7, 160, 75, 228, 41, 194, 109, 262, 143, 24, 177, 92, 245, 58, 211, 126, 279, 16, 169, 84, 237, 50, 203, 118, 271, 152, 33, 186, 101, 254, 67, 220, 135, 288]; - - return (unsafe{*PERM17.get_unchecked((index % 289) as usize)} as u32 * 83521 + - unsafe{*PERM17.get_unchecked(((index / 289) % 289) as usize)} as u32 * 289 + - unsafe{*PERM17.get_unchecked(((index / 83521) % 289) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (24137569u32 as f32)); // Results in [0,1). -} - - -fn halton19(index: u32) -> f32 { - const PERM19: [u16; 361] = [0, 209, 76, 285, 152, 38, 247, 114, 323, 171, 19, 228, 95, 304, 190, 57, 266, 133, 342, 11, 220, 87, 296, 163, 49, 258, 125, 334, 182, 30, 239, 106, 315, 201, 68, 277, 144, 353, 4, 213, 80, 289, 156, 42, 251, 118, 327, 175, 23, 232, 99, 308, 194, 61, 270, 137, 346, 15, 224, 91, 300, 167, 53, 262, 129, 338, 186, 34, 243, 110, 319, 205, 72, 281, 148, 357, 8, 217, 84, 293, 160, 46, 255, 122, 331, 179, 27, 236, 103, 312, 198, 65, 274, 141, 350, 2, 211, 78, 287, 154, 40, 249, 116, 325, 173, 21, 230, 97, 306, 192, 59, 268, 135, 344, 13, 222, 89, 298, 165, 51, 260, 127, 336, 184, 32, 241, 108, 317, 203, 70, 279, 146, 355, 6, 215, 82, 291, 158, 44, 253, 120, 329, 177, 25, 234, 101, 310, 196, 63, 272, 139, 348, 17, 226, 93, 302, 169, 55, 264, 131, 340, 188, 36, 245, 112, 321, 207, 74, 283, 150, 359, 9, 218, 85, 294, 161, 47, 256, 123, 332, 180, 28, 237, 104, 313, 199, 66, 275, 142, 351, 1, 210, 77, 286, 153, 39, 248, 115, 324, 172, 20, 229, 96, 305, 191, 58, 267, 134, 343, 12, 221, 88, 297, 164, 50, 259, 126, 335, 183, 31, 240, 107, 316, 202, 69, 278, 145, 354, 5, 214, 81, 290, 157, 43, 252, 119, 328, 176, 24, 233, 100, 309, 195, 62, 271, 138, 347, 16, 225, 92, 301, 168, 54, 263, 130, 339, 187, 35, 244, 111, 320, 206, 73, 282, 149, 358, 10, 219, 86, 295, 162, 48, 257, 124, 333, 181, 29, 238, 105, 314, 200, 67, 276, 143, 352, 3, 212, 79, 288, 155, 41, 250, 117, 326, 174, 22, 231, 98, 307, 193, 60, 269, 136, 345, 14, 223, 90, 299, 166, 52, 261, 128, 337, 185, 33, 242, 109, 318, 204, 71, 280, 147, 356, 7, 216, 83, 292, 159, 45, 254, 121, 330, 178, 26, 235, 102, 311, 197, 64, 273, 140, 349, 18, 227, 94, 303, 170, 56, 265, 132, 341, 189, 37, 246, 113, 322, 208, 75, 284, 151, 360]; - - return (unsafe{*PERM19.get_unchecked((index % 361) as usize)} as u32 * 130321 + - unsafe{*PERM19.get_unchecked(((index / 361) % 361) as usize)} as u32 * 361 + - unsafe{*PERM19.get_unchecked(((index / 130321) % 361) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (47045881u32 as f32)); // Results in [0,1). -} - - -fn halton23(index: u32) -> f32 { - const PERM23: [u16; 23] = [0, 15, 8, 4, 19, 10, 2, 17, 13, 6, 21, 11, 1, 16, 9, 5, 20, 12, 3, 18, 14, 7, 22]; - - return (unsafe{*PERM23.get_unchecked((index % 23) as usize)} as u32 * 148035889 + - unsafe{*PERM23.get_unchecked(((index / 23) % 23) as usize)} as u32 * 6436343 + - unsafe{*PERM23.get_unchecked(((index / 529) % 23) as usize)} as u32 * 279841 + - unsafe{*PERM23.get_unchecked(((index / 12167) % 23) as usize)} as u32 * 12167 + - unsafe{*PERM23.get_unchecked(((index / 279841) % 23) as usize)} as u32 * 529 + - unsafe{*PERM23.get_unchecked(((index / 6436343) % 23) as usize)} as u32 * 23 + - unsafe{*PERM23.get_unchecked(((index / 148035889) % 23) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (3404825447u32 as f32)); // Results in [0,1). -} - - -fn halton29(index: u32) -> f32 { - const PERM29: [u16; 29] = [0, 8, 21, 12, 4, 17, 25, 2, 10, 23, 15, 6, 19, 27, 14, 1, 9, 22, 13, 5, 18, 26, 3, 11, 24, 16, 7, 20, 28]; - - return (unsafe{*PERM29.get_unchecked((index % 29) as usize)} as u32 * 20511149 + - unsafe{*PERM29.get_unchecked(((index / 29) % 29) as usize)} as u32 * 707281 + - unsafe{*PERM29.get_unchecked(((index / 841) % 29) as usize)} as u32 * 24389 + - unsafe{*PERM29.get_unchecked(((index / 24389) % 29) as usize)} as u32 * 841 + - unsafe{*PERM29.get_unchecked(((index / 707281) % 29) as usize)} as u32 * 29 + - unsafe{*PERM29.get_unchecked(((index / 20511149) % 29) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (594823321u32 as f32)); // Results in [0,1). -} - - -fn halton31(index: u32) -> f32 { - const PERM31: [u16; 31] = [0, 8, 23, 12, 4, 19, 27, 14, 2, 10, 25, 17, 6, 21, 29, 15, 1, 9, 24, 13, 5, 20, 28, 16, 3, 11, 26, 18, 7, 22, 30]; - - return (unsafe{*PERM31.get_unchecked((index % 31) as usize)} as u32 * 28629151 + - unsafe{*PERM31.get_unchecked(((index / 31) % 31) as usize)} as u32 * 923521 + - unsafe{*PERM31.get_unchecked(((index / 961) % 31) as usize)} as u32 * 29791 + - unsafe{*PERM31.get_unchecked(((index / 29791) % 31) as usize)} as u32 * 961 + - unsafe{*PERM31.get_unchecked(((index / 923521) % 31) as usize)} as u32 * 31 + - unsafe{*PERM31.get_unchecked(((index / 28629151) % 31) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (887503681u32 as f32)); // Results in [0,1). -} - - -fn halton37(index: u32) -> f32 { - const PERM37: [u16; 37] = [0, 21, 8, 29, 16, 4, 25, 12, 33, 2, 23, 10, 31, 19, 6, 27, 14, 35, 18, 1, 22, 9, 30, 17, 5, 26, 13, 34, 3, 24, 11, 32, 20, 7, 28, 15, 36]; - - return (unsafe{*PERM37.get_unchecked((index % 37) as usize)} as u32 * 69343957 + - unsafe{*PERM37.get_unchecked(((index / 37) % 37) as usize)} as u32 * 1874161 + - unsafe{*PERM37.get_unchecked(((index / 1369) % 37) as usize)} as u32 * 50653 + - unsafe{*PERM37.get_unchecked(((index / 50653) % 37) as usize)} as u32 * 1369 + - unsafe{*PERM37.get_unchecked(((index / 1874161) % 37) as usize)} as u32 * 37 + - unsafe{*PERM37.get_unchecked(((index / 69343957) % 37) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (2565726409u32 as f32)); // Results in [0,1). -} - - -fn halton41(index: u32) -> f32 { - const PERM41: [u16; 41] = [0, 25, 16, 8, 33, 4, 29, 21, 12, 37, 2, 27, 18, 10, 35, 6, 31, 23, 14, 39, 20, 1, 26, 17, 9, 34, 5, 30, 22, 13, 38, 3, 28, 19, 11, 36, 7, 32, 24, 15, 40]; - - return (unsafe{*PERM41.get_unchecked((index % 41) as usize)} as u32 * 2825761 + - unsafe{*PERM41.get_unchecked(((index / 41) % 41) as usize)} as u32 * 68921 + - unsafe{*PERM41.get_unchecked(((index / 1681) % 41) as usize)} as u32 * 1681 + - unsafe{*PERM41.get_unchecked(((index / 68921) % 41) as usize)} as u32 * 41 + - unsafe{*PERM41.get_unchecked(((index / 2825761) % 41) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (115856201u32 as f32)); // Results in [0,1). -} - - -fn halton43(index: u32) -> f32 { - const PERM43: [u16; 43] = [0, 27, 16, 8, 35, 4, 31, 23, 12, 39, 20, 2, 29, 18, 10, 37, 6, 33, 25, 14, 41, 21, 1, 28, 17, 9, 36, 5, 32, 24, 13, 40, 22, 3, 30, 19, 11, 38, 7, 34, 26, 15, 42]; - - return (unsafe{*PERM43.get_unchecked((index % 43) as usize)} as u32 * 3418801 + - unsafe{*PERM43.get_unchecked(((index / 43) % 43) as usize)} as u32 * 79507 + - unsafe{*PERM43.get_unchecked(((index / 1849) % 43) as usize)} as u32 * 1849 + - unsafe{*PERM43.get_unchecked(((index / 79507) % 43) as usize)} as u32 * 43 + - unsafe{*PERM43.get_unchecked(((index / 3418801) % 43) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (147008443u32 as f32)); // Results in [0,1). -} - - -fn halton47(index: u32) -> f32 { - const PERM47: [u16; 47] = [0, 31, 16, 8, 39, 20, 4, 35, 27, 12, 43, 22, 2, 33, 18, 10, 41, 25, 6, 37, 29, 14, 45, 23, 1, 32, 17, 9, 40, 21, 5, 36, 28, 13, 44, 24, 3, 34, 19, 11, 42, 26, 7, 38, 30, 15, 46]; - - return (unsafe{*PERM47.get_unchecked((index % 47) as usize)} as u32 * 4879681 + - unsafe{*PERM47.get_unchecked(((index / 47) % 47) as usize)} as u32 * 103823 + - unsafe{*PERM47.get_unchecked(((index / 2209) % 47) as usize)} as u32 * 2209 + - unsafe{*PERM47.get_unchecked(((index / 103823) % 47) as usize)} as u32 * 47 + - unsafe{*PERM47.get_unchecked(((index / 4879681) % 47) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (229345007u32 as f32)); // Results in [0,1). -} - - -fn halton53(index: u32) -> f32 { - const PERM53: [u16; 53] = [0, 16, 37, 8, 29, 45, 24, 4, 20, 41, 12, 33, 49, 2, 18, 39, 10, 31, 47, 27, 6, 22, 43, 14, 35, 51, 26, 1, 17, 38, 9, 30, 46, 25, 5, 21, 42, 13, 34, 50, 3, 19, 40, 11, 32, 48, 28, 7, 23, 44, 15, 36, 52]; - - return (unsafe{*PERM53.get_unchecked((index % 53) as usize)} as u32 * 7890481 + - unsafe{*PERM53.get_unchecked(((index / 53) % 53) as usize)} as u32 * 148877 + - unsafe{*PERM53.get_unchecked(((index / 2809) % 53) as usize)} as u32 * 2809 + - unsafe{*PERM53.get_unchecked(((index / 148877) % 53) as usize)} as u32 * 53 + - unsafe{*PERM53.get_unchecked(((index / 7890481) % 53) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (418195493u32 as f32)); // Results in [0,1). -} - - -fn halton59(index: u32) -> f32 { - const PERM59: [u16; 59] = [0, 16, 43, 24, 8, 35, 51, 4, 20, 47, 31, 12, 39, 55, 28, 2, 18, 45, 26, 10, 37, 53, 6, 22, 49, 33, 14, 41, 57, 29, 1, 17, 44, 25, 9, 36, 52, 5, 21, 48, 32, 13, 40, 56, 30, 3, 19, 46, 27, 11, 38, 54, 7, 23, 50, 34, 15, 42, 58]; - - return (unsafe{*PERM59.get_unchecked((index % 59) as usize)} as u32 * 12117361 + - unsafe{*PERM59.get_unchecked(((index / 59) % 59) as usize)} as u32 * 205379 + - unsafe{*PERM59.get_unchecked(((index / 3481) % 59) as usize)} as u32 * 3481 + - unsafe{*PERM59.get_unchecked(((index / 205379) % 59) as usize)} as u32 * 59 + - unsafe{*PERM59.get_unchecked(((index / 12117361) % 59) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (714924299u32 as f32)); // Results in [0,1). -} - - -fn halton61(index: u32) -> f32 { - const PERM61: [u16; 61] = [0, 16, 45, 24, 8, 37, 53, 28, 4, 20, 49, 33, 12, 41, 57, 2, 18, 47, 26, 10, 39, 55, 31, 6, 22, 51, 35, 14, 43, 59, 30, 1, 17, 46, 25, 9, 38, 54, 29, 5, 21, 50, 34, 13, 42, 58, 3, 19, 48, 27, 11, 40, 56, 32, 7, 23, 52, 36, 15, 44, 60]; - - return (unsafe{*PERM61.get_unchecked((index % 61) as usize)} as u32 * 13845841 + - unsafe{*PERM61.get_unchecked(((index / 61) % 61) as usize)} as u32 * 226981 + - unsafe{*PERM61.get_unchecked(((index / 3721) % 61) as usize)} as u32 * 3721 + - unsafe{*PERM61.get_unchecked(((index / 226981) % 61) as usize)} as u32 * 61 + - unsafe{*PERM61.get_unchecked(((index / 13845841) % 61) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (844596301u32 as f32)); // Results in [0,1). -} - - -fn halton67(index: u32) -> f32 { - const PERM67: [u16; 67] = [0, 35, 16, 51, 8, 43, 24, 59, 4, 39, 20, 55, 12, 47, 28, 63, 32, 2, 37, 18, 53, 10, 45, 26, 61, 6, 41, 22, 57, 14, 49, 30, 65, 33, 1, 36, 17, 52, 9, 44, 25, 60, 5, 40, 21, 56, 13, 48, 29, 64, 34, 3, 38, 19, 54, 11, 46, 27, 62, 7, 42, 23, 58, 15, 50, 31, 66]; - - return (unsafe{*PERM67.get_unchecked((index % 67) as usize)} as u32 * 20151121 + - unsafe{*PERM67.get_unchecked(((index / 67) % 67) as usize)} as u32 * 300763 + - unsafe{*PERM67.get_unchecked(((index / 4489) % 67) as usize)} as u32 * 4489 + - unsafe{*PERM67.get_unchecked(((index / 300763) % 67) as usize)} as u32 * 67 + - unsafe{*PERM67.get_unchecked(((index / 20151121) % 67) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (1350125107u32 as f32)); // Results in [0,1). -} - - -fn halton71(index: u32) -> f32 { - const PERM71: [u16; 71] = [0, 39, 16, 55, 8, 47, 24, 63, 32, 4, 43, 20, 59, 12, 51, 28, 67, 34, 2, 41, 18, 57, 10, 49, 26, 65, 37, 6, 45, 22, 61, 14, 53, 30, 69, 35, 1, 40, 17, 56, 9, 48, 25, 64, 33, 5, 44, 21, 60, 13, 52, 29, 68, 36, 3, 42, 19, 58, 11, 50, 27, 66, 38, 7, 46, 23, 62, 15, 54, 31, 70]; - - return (unsafe{*PERM71.get_unchecked((index % 71) as usize)} as u32 * 25411681 + - unsafe{*PERM71.get_unchecked(((index / 71) % 71) as usize)} as u32 * 357911 + - unsafe{*PERM71.get_unchecked(((index / 5041) % 71) as usize)} as u32 * 5041 + - unsafe{*PERM71.get_unchecked(((index / 357911) % 71) as usize)} as u32 * 71 + - unsafe{*PERM71.get_unchecked(((index / 25411681) % 71) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (1804229351u32 as f32)); // Results in [0,1). -} - - -fn halton73(index: u32) -> f32 { - const PERM73: [u16; 73] = [0, 41, 16, 57, 32, 8, 49, 24, 65, 4, 45, 20, 61, 37, 12, 53, 28, 69, 2, 43, 18, 59, 34, 10, 51, 26, 67, 6, 47, 22, 63, 39, 14, 55, 30, 71, 36, 1, 42, 17, 58, 33, 9, 50, 25, 66, 5, 46, 21, 62, 38, 13, 54, 29, 70, 3, 44, 19, 60, 35, 11, 52, 27, 68, 7, 48, 23, 64, 40, 15, 56, 31, 72]; - - return (unsafe{*PERM73.get_unchecked((index % 73) as usize)} as u32 * 28398241 + - unsafe{*PERM73.get_unchecked(((index / 73) % 73) as usize)} as u32 * 389017 + - unsafe{*PERM73.get_unchecked(((index / 5329) % 73) as usize)} as u32 * 5329 + - unsafe{*PERM73.get_unchecked(((index / 389017) % 73) as usize)} as u32 * 73 + - unsafe{*PERM73.get_unchecked(((index / 28398241) % 73) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (2073071593u32 as f32)); // Results in [0,1). -} - - -fn halton79(index: u32) -> f32 { - const PERM79: [u16; 79] = [0, 47, 16, 63, 32, 8, 55, 24, 71, 36, 4, 51, 20, 67, 43, 12, 59, 28, 75, 38, 2, 49, 18, 65, 34, 10, 57, 26, 73, 41, 6, 53, 22, 69, 45, 14, 61, 30, 77, 39, 1, 48, 17, 64, 33, 9, 56, 25, 72, 37, 5, 52, 21, 68, 44, 13, 60, 29, 76, 40, 3, 50, 19, 66, 35, 11, 58, 27, 74, 42, 7, 54, 23, 70, 46, 15, 62, 31, 78]; - - return (unsafe{*PERM79.get_unchecked((index % 79) as usize)} as u32 * 38950081 + - unsafe{*PERM79.get_unchecked(((index / 79) % 79) as usize)} as u32 * 493039 + - unsafe{*PERM79.get_unchecked(((index / 6241) % 79) as usize)} as u32 * 6241 + - unsafe{*PERM79.get_unchecked(((index / 493039) % 79) as usize)} as u32 * 79 + - unsafe{*PERM79.get_unchecked(((index / 38950081) % 79) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (3077056399u32 as f32)); // Results in [0,1). -} - - -fn halton83(index: u32) -> f32 { - const PERM83: [u16; 83] = [0, 51, 32, 16, 67, 8, 59, 43, 24, 75, 4, 55, 36, 20, 71, 12, 63, 47, 28, 79, 40, 2, 53, 34, 18, 69, 10, 61, 45, 26, 77, 6, 57, 38, 22, 73, 14, 65, 49, 30, 81, 41, 1, 52, 33, 17, 68, 9, 60, 44, 25, 76, 5, 56, 37, 21, 72, 13, 64, 48, 29, 80, 42, 3, 54, 35, 19, 70, 11, 62, 46, 27, 78, 7, 58, 39, 23, 74, 15, 66, 50, 31, 82]; - - return (unsafe{*PERM83.get_unchecked((index % 83) as usize)} as u32 * 47458321 + - unsafe{*PERM83.get_unchecked(((index / 83) % 83) as usize)} as u32 * 571787 + - unsafe{*PERM83.get_unchecked(((index / 6889) % 83) as usize)} as u32 * 6889 + - unsafe{*PERM83.get_unchecked(((index / 571787) % 83) as usize)} as u32 * 83 + - unsafe{*PERM83.get_unchecked(((index / 47458321) % 83) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (3939040643u32 as f32)); // Results in [0,1). -} - - -fn halton89(index: u32) -> f32 { - const PERM89: [u16; 89] = [0, 57, 32, 16, 73, 40, 8, 65, 49, 24, 81, 4, 61, 36, 20, 77, 45, 12, 69, 53, 28, 85, 2, 59, 34, 18, 75, 42, 10, 67, 51, 26, 83, 6, 63, 38, 22, 79, 47, 14, 71, 55, 30, 87, 44, 1, 58, 33, 17, 74, 41, 9, 66, 50, 25, 82, 5, 62, 37, 21, 78, 46, 13, 70, 54, 29, 86, 3, 60, 35, 19, 76, 43, 11, 68, 52, 27, 84, 7, 64, 39, 23, 80, 48, 15, 72, 56, 31, 88]; - - return (unsafe{*PERM89.get_unchecked((index % 89) as usize)} as u32 * 704969 + - unsafe{*PERM89.get_unchecked(((index / 89) % 89) as usize)} as u32 * 7921 + - unsafe{*PERM89.get_unchecked(((index / 7921) % 89) as usize)} as u32 * 89 + - unsafe{*PERM89.get_unchecked(((index / 704969) % 89) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (62742241u32 as f32)); // Results in [0,1). -} - - -fn halton97(index: u32) -> f32 { - const PERM97: [u16; 97] = [0, 32, 65, 16, 49, 81, 8, 40, 73, 24, 57, 89, 4, 36, 69, 20, 53, 85, 12, 44, 77, 28, 61, 93, 2, 34, 67, 18, 51, 83, 10, 42, 75, 26, 59, 91, 6, 38, 71, 22, 55, 87, 14, 46, 79, 30, 63, 95, 48, 1, 33, 66, 17, 50, 82, 9, 41, 74, 25, 58, 90, 5, 37, 70, 21, 54, 86, 13, 45, 78, 29, 62, 94, 3, 35, 68, 19, 52, 84, 11, 43, 76, 27, 60, 92, 7, 39, 72, 23, 56, 88, 15, 47, 80, 31, 64, 96]; - - return (unsafe{*PERM97.get_unchecked((index % 97) as usize)} as u32 * 912673 + - unsafe{*PERM97.get_unchecked(((index / 97) % 97) as usize)} as u32 * 9409 + - unsafe{*PERM97.get_unchecked(((index / 9409) % 97) as usize)} as u32 * 97 + - unsafe{*PERM97.get_unchecked(((index / 912673) % 97) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (88529281u32 as f32)); // Results in [0,1). -} - - -fn halton101(index: u32) -> f32 { - const PERM101: [u16; 101] = [0, 32, 69, 16, 53, 85, 8, 40, 77, 24, 61, 93, 48, 4, 36, 73, 20, 57, 89, 12, 44, 81, 28, 65, 97, 2, 34, 71, 18, 55, 87, 10, 42, 79, 26, 63, 95, 51, 6, 38, 75, 22, 59, 91, 14, 46, 83, 30, 67, 99, 50, 1, 33, 70, 17, 54, 86, 9, 41, 78, 25, 62, 94, 49, 5, 37, 74, 21, 58, 90, 13, 45, 82, 29, 66, 98, 3, 35, 72, 19, 56, 88, 11, 43, 80, 27, 64, 96, 52, 7, 39, 76, 23, 60, 92, 15, 47, 84, 31, 68, 100]; - - return (unsafe{*PERM101.get_unchecked((index % 101) as usize)} as u32 * 1030301 + - unsafe{*PERM101.get_unchecked(((index / 101) % 101) as usize)} as u32 * 10201 + - unsafe{*PERM101.get_unchecked(((index / 10201) % 101) as usize)} as u32 * 101 + - unsafe{*PERM101.get_unchecked(((index / 1030301) % 101) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (104060401u32 as f32)); // Results in [0,1). -} - - -fn halton103(index: u32) -> f32 { - const PERM103: [u16; 103] = [0, 32, 71, 16, 55, 87, 8, 40, 79, 24, 63, 95, 48, 4, 36, 75, 20, 59, 91, 12, 44, 83, 28, 67, 99, 50, 2, 34, 73, 18, 57, 89, 10, 42, 81, 26, 65, 97, 53, 6, 38, 77, 22, 61, 93, 14, 46, 85, 30, 69, 101, 51, 1, 33, 72, 17, 56, 88, 9, 41, 80, 25, 64, 96, 49, 5, 37, 76, 21, 60, 92, 13, 45, 84, 29, 68, 100, 52, 3, 35, 74, 19, 58, 90, 11, 43, 82, 27, 66, 98, 54, 7, 39, 78, 23, 62, 94, 15, 47, 86, 31, 70, 102]; - - return (unsafe{*PERM103.get_unchecked((index % 103) as usize)} as u32 * 1092727 + - unsafe{*PERM103.get_unchecked(((index / 103) % 103) as usize)} as u32 * 10609 + - unsafe{*PERM103.get_unchecked(((index / 10609) % 103) as usize)} as u32 * 103 + - unsafe{*PERM103.get_unchecked(((index / 1092727) % 103) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (112550881u32 as f32)); // Results in [0,1). -} - - -fn halton107(index: u32) -> f32 { - const PERM107: [u16; 107] = [0, 32, 75, 16, 59, 91, 48, 8, 40, 83, 24, 67, 99, 4, 36, 79, 20, 63, 95, 55, 12, 44, 87, 28, 71, 103, 52, 2, 34, 77, 18, 61, 93, 50, 10, 42, 85, 26, 69, 101, 6, 38, 81, 22, 65, 97, 57, 14, 46, 89, 30, 73, 105, 53, 1, 33, 76, 17, 60, 92, 49, 9, 41, 84, 25, 68, 100, 5, 37, 80, 21, 64, 96, 56, 13, 45, 88, 29, 72, 104, 54, 3, 35, 78, 19, 62, 94, 51, 11, 43, 86, 27, 70, 102, 7, 39, 82, 23, 66, 98, 58, 15, 47, 90, 31, 74, 106]; - - return (unsafe{*PERM107.get_unchecked((index % 107) as usize)} as u32 * 1225043 + - unsafe{*PERM107.get_unchecked(((index / 107) % 107) as usize)} as u32 * 11449 + - unsafe{*PERM107.get_unchecked(((index / 11449) % 107) as usize)} as u32 * 107 + - unsafe{*PERM107.get_unchecked(((index / 1225043) % 107) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (131079601u32 as f32)); // Results in [0,1). -} - - -fn halton109(index: u32) -> f32 { - const PERM109: [u16; 109] = [0, 32, 77, 16, 61, 93, 48, 8, 40, 85, 24, 69, 101, 52, 4, 36, 81, 20, 65, 97, 57, 12, 44, 89, 28, 73, 105, 2, 34, 79, 18, 63, 95, 50, 10, 42, 87, 26, 71, 103, 55, 6, 38, 83, 22, 67, 99, 59, 14, 46, 91, 30, 75, 107, 54, 1, 33, 78, 17, 62, 94, 49, 9, 41, 86, 25, 70, 102, 53, 5, 37, 82, 21, 66, 98, 58, 13, 45, 90, 29, 74, 106, 3, 35, 80, 19, 64, 96, 51, 11, 43, 88, 27, 72, 104, 56, 7, 39, 84, 23, 68, 100, 60, 15, 47, 92, 31, 76, 108]; - - return (unsafe{*PERM109.get_unchecked((index % 109) as usize)} as u32 * 1295029 + - unsafe{*PERM109.get_unchecked(((index / 109) % 109) as usize)} as u32 * 11881 + - unsafe{*PERM109.get_unchecked(((index / 11881) % 109) as usize)} as u32 * 109 + - unsafe{*PERM109.get_unchecked(((index / 1295029) % 109) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (141158161u32 as f32)); // Results in [0,1). -} - - -fn halton113(index: u32) -> f32 { - const PERM113: [u16; 113] = [0, 32, 81, 48, 16, 65, 97, 8, 40, 89, 57, 24, 73, 105, 4, 36, 85, 52, 20, 69, 101, 12, 44, 93, 61, 28, 77, 109, 2, 34, 83, 50, 18, 67, 99, 10, 42, 91, 59, 26, 75, 107, 6, 38, 87, 54, 22, 71, 103, 14, 46, 95, 63, 30, 79, 111, 56, 1, 33, 82, 49, 17, 66, 98, 9, 41, 90, 58, 25, 74, 106, 5, 37, 86, 53, 21, 70, 102, 13, 45, 94, 62, 29, 78, 110, 3, 35, 84, 51, 19, 68, 100, 11, 43, 92, 60, 27, 76, 108, 7, 39, 88, 55, 23, 72, 104, 15, 47, 96, 64, 31, 80, 112]; - - return (unsafe{*PERM113.get_unchecked((index % 113) as usize)} as u32 * 1442897 + - unsafe{*PERM113.get_unchecked(((index / 113) % 113) as usize)} as u32 * 12769 + - unsafe{*PERM113.get_unchecked(((index / 12769) % 113) as usize)} as u32 * 113 + - unsafe{*PERM113.get_unchecked(((index / 1442897) % 113) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (163047361u32 as f32)); // Results in [0,1). -} - - -fn halton127(index: u32) -> f32 { - const PERM127: [u16; 127] = [0, 32, 95, 48, 16, 79, 111, 56, 8, 40, 103, 71, 24, 87, 119, 60, 4, 36, 99, 52, 20, 83, 115, 67, 12, 44, 107, 75, 28, 91, 123, 62, 2, 34, 97, 50, 18, 81, 113, 58, 10, 42, 105, 73, 26, 89, 121, 65, 6, 38, 101, 54, 22, 85, 117, 69, 14, 46, 109, 77, 30, 93, 125, 63, 1, 33, 96, 49, 17, 80, 112, 57, 9, 41, 104, 72, 25, 88, 120, 61, 5, 37, 100, 53, 21, 84, 116, 68, 13, 45, 108, 76, 29, 92, 124, 64, 3, 35, 98, 51, 19, 82, 114, 59, 11, 43, 106, 74, 27, 90, 122, 66, 7, 39, 102, 55, 23, 86, 118, 70, 15, 47, 110, 78, 31, 94, 126]; - - return (unsafe{*PERM127.get_unchecked((index % 127) as usize)} as u32 * 2048383 + - unsafe{*PERM127.get_unchecked(((index / 127) % 127) as usize)} as u32 * 16129 + - unsafe{*PERM127.get_unchecked(((index / 16129) % 127) as usize)} as u32 * 127 + - unsafe{*PERM127.get_unchecked(((index / 2048383) % 127) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (260144641u32 as f32)); // Results in [0,1). -} - - -fn halton131(index: u32) -> f32 { - const PERM131: [u16; 131] = [0, 67, 32, 99, 16, 83, 48, 115, 8, 75, 40, 107, 24, 91, 56, 123, 4, 71, 36, 103, 20, 87, 52, 119, 12, 79, 44, 111, 28, 95, 60, 127, 64, 2, 69, 34, 101, 18, 85, 50, 117, 10, 77, 42, 109, 26, 93, 58, 125, 6, 73, 38, 105, 22, 89, 54, 121, 14, 81, 46, 113, 30, 97, 62, 129, 65, 1, 68, 33, 100, 17, 84, 49, 116, 9, 76, 41, 108, 25, 92, 57, 124, 5, 72, 37, 104, 21, 88, 53, 120, 13, 80, 45, 112, 29, 96, 61, 128, 66, 3, 70, 35, 102, 19, 86, 51, 118, 11, 78, 43, 110, 27, 94, 59, 126, 7, 74, 39, 106, 23, 90, 55, 122, 15, 82, 47, 114, 31, 98, 63, 130]; - - return (unsafe{*PERM131.get_unchecked((index % 131) as usize)} as u32 * 2248091 + - unsafe{*PERM131.get_unchecked(((index / 131) % 131) as usize)} as u32 * 17161 + - unsafe{*PERM131.get_unchecked(((index / 17161) % 131) as usize)} as u32 * 131 + - unsafe{*PERM131.get_unchecked(((index / 2248091) % 131) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (294499921u32 as f32)); // Results in [0,1). -} - - -fn halton137(index: u32) -> f32 { - const PERM137: [u16; 137] = [0, 73, 32, 105, 16, 89, 48, 121, 64, 8, 81, 40, 113, 24, 97, 56, 129, 4, 77, 36, 109, 20, 93, 52, 125, 69, 12, 85, 44, 117, 28, 101, 60, 133, 2, 75, 34, 107, 18, 91, 50, 123, 66, 10, 83, 42, 115, 26, 99, 58, 131, 6, 79, 38, 111, 22, 95, 54, 127, 71, 14, 87, 46, 119, 30, 103, 62, 135, 68, 1, 74, 33, 106, 17, 90, 49, 122, 65, 9, 82, 41, 114, 25, 98, 57, 130, 5, 78, 37, 110, 21, 94, 53, 126, 70, 13, 86, 45, 118, 29, 102, 61, 134, 3, 76, 35, 108, 19, 92, 51, 124, 67, 11, 84, 43, 116, 27, 100, 59, 132, 7, 80, 39, 112, 23, 96, 55, 128, 72, 15, 88, 47, 120, 31, 104, 63, 136]; - - return (unsafe{*PERM137.get_unchecked((index % 137) as usize)} as u32 * 2571353 + - unsafe{*PERM137.get_unchecked(((index / 137) % 137) as usize)} as u32 * 18769 + - unsafe{*PERM137.get_unchecked(((index / 18769) % 137) as usize)} as u32 * 137 + - unsafe{*PERM137.get_unchecked(((index / 2571353) % 137) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (352275361u32 as f32)); // Results in [0,1). -} - - -fn halton139(index: u32) -> f32 { - const PERM139: [u16; 139] = [0, 75, 32, 107, 16, 91, 48, 123, 64, 8, 83, 40, 115, 24, 99, 56, 131, 4, 79, 36, 111, 20, 95, 52, 127, 71, 12, 87, 44, 119, 28, 103, 60, 135, 68, 2, 77, 34, 109, 18, 93, 50, 125, 66, 10, 85, 42, 117, 26, 101, 58, 133, 6, 81, 38, 113, 22, 97, 54, 129, 73, 14, 89, 46, 121, 30, 105, 62, 137, 69, 1, 76, 33, 108, 17, 92, 49, 124, 65, 9, 84, 41, 116, 25, 100, 57, 132, 5, 80, 37, 112, 21, 96, 53, 128, 72, 13, 88, 45, 120, 29, 104, 61, 136, 70, 3, 78, 35, 110, 19, 94, 51, 126, 67, 11, 86, 43, 118, 27, 102, 59, 134, 7, 82, 39, 114, 23, 98, 55, 130, 74, 15, 90, 47, 122, 31, 106, 63, 138]; - - return (unsafe{*PERM139.get_unchecked((index % 139) as usize)} as u32 * 2685619 + - unsafe{*PERM139.get_unchecked(((index / 139) % 139) as usize)} as u32 * 19321 + - unsafe{*PERM139.get_unchecked(((index / 19321) % 139) as usize)} as u32 * 139 + - unsafe{*PERM139.get_unchecked(((index / 2685619) % 139) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (373301041u32 as f32)); // Results in [0,1). -} - - -fn halton149(index: u32) -> f32 { - const PERM149: [u16; 149] = [0, 85, 32, 117, 64, 16, 101, 48, 133, 8, 93, 40, 125, 77, 24, 109, 56, 141, 72, 4, 89, 36, 121, 68, 20, 105, 52, 137, 12, 97, 44, 129, 81, 28, 113, 60, 145, 2, 87, 34, 119, 66, 18, 103, 50, 135, 10, 95, 42, 127, 79, 26, 111, 58, 143, 75, 6, 91, 38, 123, 70, 22, 107, 54, 139, 14, 99, 46, 131, 83, 30, 115, 62, 147, 74, 1, 86, 33, 118, 65, 17, 102, 49, 134, 9, 94, 41, 126, 78, 25, 110, 57, 142, 73, 5, 90, 37, 122, 69, 21, 106, 53, 138, 13, 98, 45, 130, 82, 29, 114, 61, 146, 3, 88, 35, 120, 67, 19, 104, 51, 136, 11, 96, 43, 128, 80, 27, 112, 59, 144, 76, 7, 92, 39, 124, 71, 23, 108, 55, 140, 15, 100, 47, 132, 84, 31, 116, 63, 148]; - - return (unsafe{*PERM149.get_unchecked((index % 149) as usize)} as u32 * 3307949 + - unsafe{*PERM149.get_unchecked(((index / 149) % 149) as usize)} as u32 * 22201 + - unsafe{*PERM149.get_unchecked(((index / 22201) % 149) as usize)} as u32 * 149 + - unsafe{*PERM149.get_unchecked(((index / 3307949) % 149) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (492884401u32 as f32)); // Results in [0,1). -} - - -fn halton151(index: u32) -> f32 { - const PERM151: [u16; 151] = [0, 87, 32, 119, 64, 16, 103, 48, 135, 8, 95, 40, 127, 79, 24, 111, 56, 143, 72, 4, 91, 36, 123, 68, 20, 107, 52, 139, 12, 99, 44, 131, 83, 28, 115, 60, 147, 74, 2, 89, 34, 121, 66, 18, 105, 50, 137, 10, 97, 42, 129, 81, 26, 113, 58, 145, 77, 6, 93, 38, 125, 70, 22, 109, 54, 141, 14, 101, 46, 133, 85, 30, 117, 62, 149, 75, 1, 88, 33, 120, 65, 17, 104, 49, 136, 9, 96, 41, 128, 80, 25, 112, 57, 144, 73, 5, 92, 37, 124, 69, 21, 108, 53, 140, 13, 100, 45, 132, 84, 29, 116, 61, 148, 76, 3, 90, 35, 122, 67, 19, 106, 51, 138, 11, 98, 43, 130, 82, 27, 114, 59, 146, 78, 7, 94, 39, 126, 71, 23, 110, 55, 142, 15, 102, 47, 134, 86, 31, 118, 63, 150]; - - return (unsafe{*PERM151.get_unchecked((index % 151) as usize)} as u32 * 3442951 + - unsafe{*PERM151.get_unchecked(((index / 151) % 151) as usize)} as u32 * 22801 + - unsafe{*PERM151.get_unchecked(((index / 22801) % 151) as usize)} as u32 * 151 + - unsafe{*PERM151.get_unchecked(((index / 3442951) % 151) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (519885601u32 as f32)); // Results in [0,1). -} - - -fn halton157(index: u32) -> f32 { - const PERM157: [u16; 157] = [0, 93, 32, 125, 64, 16, 109, 48, 141, 72, 8, 101, 40, 133, 85, 24, 117, 56, 149, 76, 4, 97, 36, 129, 68, 20, 113, 52, 145, 81, 12, 105, 44, 137, 89, 28, 121, 60, 153, 2, 95, 34, 127, 66, 18, 111, 50, 143, 74, 10, 103, 42, 135, 87, 26, 119, 58, 151, 79, 6, 99, 38, 131, 70, 22, 115, 54, 147, 83, 14, 107, 46, 139, 91, 30, 123, 62, 155, 78, 1, 94, 33, 126, 65, 17, 110, 49, 142, 73, 9, 102, 41, 134, 86, 25, 118, 57, 150, 77, 5, 98, 37, 130, 69, 21, 114, 53, 146, 82, 13, 106, 45, 138, 90, 29, 122, 61, 154, 3, 96, 35, 128, 67, 19, 112, 51, 144, 75, 11, 104, 43, 136, 88, 27, 120, 59, 152, 80, 7, 100, 39, 132, 71, 23, 116, 55, 148, 84, 15, 108, 47, 140, 92, 31, 124, 63, 156]; - - return (unsafe{*PERM157.get_unchecked((index % 157) as usize)} as u32 * 3869893 + - unsafe{*PERM157.get_unchecked(((index / 157) % 157) as usize)} as u32 * 24649 + - unsafe{*PERM157.get_unchecked(((index / 24649) % 157) as usize)} as u32 * 157 + - unsafe{*PERM157.get_unchecked(((index / 3869893) % 157) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (607573201u32 as f32)); // Results in [0,1). -} - - -fn halton163(index: u32) -> f32 { - const PERM163: [u16; 163] = [0, 99, 64, 32, 131, 16, 115, 83, 48, 147, 8, 107, 72, 40, 139, 24, 123, 91, 56, 155, 4, 103, 68, 36, 135, 20, 119, 87, 52, 151, 12, 111, 76, 44, 143, 28, 127, 95, 60, 159, 80, 2, 101, 66, 34, 133, 18, 117, 85, 50, 149, 10, 109, 74, 42, 141, 26, 125, 93, 58, 157, 6, 105, 70, 38, 137, 22, 121, 89, 54, 153, 14, 113, 78, 46, 145, 30, 129, 97, 62, 161, 81, 1, 100, 65, 33, 132, 17, 116, 84, 49, 148, 9, 108, 73, 41, 140, 25, 124, 92, 57, 156, 5, 104, 69, 37, 136, 21, 120, 88, 53, 152, 13, 112, 77, 45, 144, 29, 128, 96, 61, 160, 82, 3, 102, 67, 35, 134, 19, 118, 86, 51, 150, 11, 110, 75, 43, 142, 27, 126, 94, 59, 158, 7, 106, 71, 39, 138, 23, 122, 90, 55, 154, 15, 114, 79, 47, 146, 31, 130, 98, 63, 162]; - - return (unsafe{*PERM163.get_unchecked((index % 163) as usize)} as u32 * 4330747 + - unsafe{*PERM163.get_unchecked(((index / 163) % 163) as usize)} as u32 * 26569 + - unsafe{*PERM163.get_unchecked(((index / 26569) % 163) as usize)} as u32 * 163 + - unsafe{*PERM163.get_unchecked(((index / 4330747) % 163) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (705911761u32 as f32)); // Results in [0,1). -} - - -fn halton167(index: u32) -> f32 { - const PERM167: [u16; 167] = [0, 103, 64, 32, 135, 16, 119, 87, 48, 151, 8, 111, 72, 40, 143, 24, 127, 95, 56, 159, 80, 4, 107, 68, 36, 139, 20, 123, 91, 52, 155, 12, 115, 76, 44, 147, 28, 131, 99, 60, 163, 82, 2, 105, 66, 34, 137, 18, 121, 89, 50, 153, 10, 113, 74, 42, 145, 26, 129, 97, 58, 161, 85, 6, 109, 70, 38, 141, 22, 125, 93, 54, 157, 14, 117, 78, 46, 149, 30, 133, 101, 62, 165, 83, 1, 104, 65, 33, 136, 17, 120, 88, 49, 152, 9, 112, 73, 41, 144, 25, 128, 96, 57, 160, 81, 5, 108, 69, 37, 140, 21, 124, 92, 53, 156, 13, 116, 77, 45, 148, 29, 132, 100, 61, 164, 84, 3, 106, 67, 35, 138, 19, 122, 90, 51, 154, 11, 114, 75, 43, 146, 27, 130, 98, 59, 162, 86, 7, 110, 71, 39, 142, 23, 126, 94, 55, 158, 15, 118, 79, 47, 150, 31, 134, 102, 63, 166]; - - return (unsafe{*PERM167.get_unchecked((index % 167) as usize)} as u32 * 4657463 + - unsafe{*PERM167.get_unchecked(((index / 167) % 167) as usize)} as u32 * 27889 + - unsafe{*PERM167.get_unchecked(((index / 27889) % 167) as usize)} as u32 * 167 + - unsafe{*PERM167.get_unchecked(((index / 4657463) % 167) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (777796321u32 as f32)); // Results in [0,1). -} - - -fn halton173(index: u32) -> f32 { - const PERM173: [u16; 173] = [0, 109, 64, 32, 141, 16, 125, 93, 48, 157, 80, 8, 117, 72, 40, 149, 24, 133, 101, 56, 165, 84, 4, 113, 68, 36, 145, 20, 129, 97, 52, 161, 89, 12, 121, 76, 44, 153, 28, 137, 105, 60, 169, 2, 111, 66, 34, 143, 18, 127, 95, 50, 159, 82, 10, 119, 74, 42, 151, 26, 135, 103, 58, 167, 87, 6, 115, 70, 38, 147, 22, 131, 99, 54, 163, 91, 14, 123, 78, 46, 155, 30, 139, 107, 62, 171, 86, 1, 110, 65, 33, 142, 17, 126, 94, 49, 158, 81, 9, 118, 73, 41, 150, 25, 134, 102, 57, 166, 85, 5, 114, 69, 37, 146, 21, 130, 98, 53, 162, 90, 13, 122, 77, 45, 154, 29, 138, 106, 61, 170, 3, 112, 67, 35, 144, 19, 128, 96, 51, 160, 83, 11, 120, 75, 43, 152, 27, 136, 104, 59, 168, 88, 7, 116, 71, 39, 148, 23, 132, 100, 55, 164, 92, 15, 124, 79, 47, 156, 31, 140, 108, 63, 172]; - - return (unsafe{*PERM173.get_unchecked((index % 173) as usize)} as u32 * 5177717 + - unsafe{*PERM173.get_unchecked(((index / 173) % 173) as usize)} as u32 * 29929 + - unsafe{*PERM173.get_unchecked(((index / 29929) % 173) as usize)} as u32 * 173 + - unsafe{*PERM173.get_unchecked(((index / 5177717) % 173) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (895745041u32 as f32)); // Results in [0,1). -} - - -fn halton179(index: u32) -> f32 { - const PERM179: [u16; 179] = [0, 115, 64, 32, 147, 80, 16, 131, 99, 48, 163, 8, 123, 72, 40, 155, 91, 24, 139, 107, 56, 171, 4, 119, 68, 36, 151, 84, 20, 135, 103, 52, 167, 12, 127, 76, 44, 159, 95, 28, 143, 111, 60, 175, 88, 2, 117, 66, 34, 149, 82, 18, 133, 101, 50, 165, 10, 125, 74, 42, 157, 93, 26, 141, 109, 58, 173, 6, 121, 70, 38, 153, 86, 22, 137, 105, 54, 169, 14, 129, 78, 46, 161, 97, 30, 145, 113, 62, 177, 89, 1, 116, 65, 33, 148, 81, 17, 132, 100, 49, 164, 9, 124, 73, 41, 156, 92, 25, 140, 108, 57, 172, 5, 120, 69, 37, 152, 85, 21, 136, 104, 53, 168, 13, 128, 77, 45, 160, 96, 29, 144, 112, 61, 176, 90, 3, 118, 67, 35, 150, 83, 19, 134, 102, 51, 166, 11, 126, 75, 43, 158, 94, 27, 142, 110, 59, 174, 7, 122, 71, 39, 154, 87, 23, 138, 106, 55, 170, 15, 130, 79, 47, 162, 98, 31, 146, 114, 63, 178]; - - return (unsafe{*PERM179.get_unchecked((index % 179) as usize)} as u32 * 5735339 + - unsafe{*PERM179.get_unchecked(((index / 179) % 179) as usize)} as u32 * 32041 + - unsafe{*PERM179.get_unchecked(((index / 32041) % 179) as usize)} as u32 * 179 + - unsafe{*PERM179.get_unchecked(((index / 5735339) % 179) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (1026625681u32 as f32)); // Results in [0,1). -} - - -fn halton181(index: u32) -> f32 { - const PERM181: [u16; 181] = [0, 117, 64, 32, 149, 80, 16, 133, 101, 48, 165, 8, 125, 72, 40, 157, 93, 24, 141, 109, 56, 173, 88, 4, 121, 68, 36, 153, 84, 20, 137, 105, 52, 169, 12, 129, 76, 44, 161, 97, 28, 145, 113, 60, 177, 2, 119, 66, 34, 151, 82, 18, 135, 103, 50, 167, 10, 127, 74, 42, 159, 95, 26, 143, 111, 58, 175, 91, 6, 123, 70, 38, 155, 86, 22, 139, 107, 54, 171, 14, 131, 78, 46, 163, 99, 30, 147, 115, 62, 179, 90, 1, 118, 65, 33, 150, 81, 17, 134, 102, 49, 166, 9, 126, 73, 41, 158, 94, 25, 142, 110, 57, 174, 89, 5, 122, 69, 37, 154, 85, 21, 138, 106, 53, 170, 13, 130, 77, 45, 162, 98, 29, 146, 114, 61, 178, 3, 120, 67, 35, 152, 83, 19, 136, 104, 51, 168, 11, 128, 75, 43, 160, 96, 27, 144, 112, 59, 176, 92, 7, 124, 71, 39, 156, 87, 23, 140, 108, 55, 172, 15, 132, 79, 47, 164, 100, 31, 148, 116, 63, 180]; - - return (unsafe{*PERM181.get_unchecked((index % 181) as usize)} as u32 * 5929741 + - unsafe{*PERM181.get_unchecked(((index / 181) % 181) as usize)} as u32 * 32761 + - unsafe{*PERM181.get_unchecked(((index / 32761) % 181) as usize)} as u32 * 181 + - unsafe{*PERM181.get_unchecked(((index / 5929741) % 181) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (1073283121u32 as f32)); // Results in [0,1). -} - - -fn halton191(index: u32) -> f32 { - const PERM191: [u16; 191] = [0, 127, 64, 32, 159, 80, 16, 143, 111, 48, 175, 88, 8, 135, 72, 40, 167, 103, 24, 151, 119, 56, 183, 92, 4, 131, 68, 36, 163, 84, 20, 147, 115, 52, 179, 99, 12, 139, 76, 44, 171, 107, 28, 155, 123, 60, 187, 94, 2, 129, 66, 34, 161, 82, 18, 145, 113, 50, 177, 90, 10, 137, 74, 42, 169, 105, 26, 153, 121, 58, 185, 97, 6, 133, 70, 38, 165, 86, 22, 149, 117, 54, 181, 101, 14, 141, 78, 46, 173, 109, 30, 157, 125, 62, 189, 95, 1, 128, 65, 33, 160, 81, 17, 144, 112, 49, 176, 89, 9, 136, 73, 41, 168, 104, 25, 152, 120, 57, 184, 93, 5, 132, 69, 37, 164, 85, 21, 148, 116, 53, 180, 100, 13, 140, 77, 45, 172, 108, 29, 156, 124, 61, 188, 96, 3, 130, 67, 35, 162, 83, 19, 146, 114, 51, 178, 91, 11, 138, 75, 43, 170, 106, 27, 154, 122, 59, 186, 98, 7, 134, 71, 39, 166, 87, 23, 150, 118, 55, 182, 102, 15, 142, 79, 47, 174, 110, 31, 158, 126, 63, 190]; - - return (unsafe{*PERM191.get_unchecked((index % 191) as usize)} as u32 * 6967871 + - unsafe{*PERM191.get_unchecked(((index / 191) % 191) as usize)} as u32 * 36481 + - unsafe{*PERM191.get_unchecked(((index / 36481) % 191) as usize)} as u32 * 191 + - unsafe{*PERM191.get_unchecked(((index / 6967871) % 191) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (1330863361u32 as f32)); // Results in [0,1). -} - - -fn halton193(index: u32) -> f32 { - const PERM193: [u16; 193] = [0, 64, 129, 32, 97, 161, 16, 80, 145, 48, 113, 177, 8, 72, 137, 40, 105, 169, 24, 88, 153, 56, 121, 185, 4, 68, 133, 36, 101, 165, 20, 84, 149, 52, 117, 181, 12, 76, 141, 44, 109, 173, 28, 92, 157, 60, 125, 189, 2, 66, 131, 34, 99, 163, 18, 82, 147, 50, 115, 179, 10, 74, 139, 42, 107, 171, 26, 90, 155, 58, 123, 187, 6, 70, 135, 38, 103, 167, 22, 86, 151, 54, 119, 183, 14, 78, 143, 46, 111, 175, 30, 94, 159, 62, 127, 191, 96, 1, 65, 130, 33, 98, 162, 17, 81, 146, 49, 114, 178, 9, 73, 138, 41, 106, 170, 25, 89, 154, 57, 122, 186, 5, 69, 134, 37, 102, 166, 21, 85, 150, 53, 118, 182, 13, 77, 142, 45, 110, 174, 29, 93, 158, 61, 126, 190, 3, 67, 132, 35, 100, 164, 19, 83, 148, 51, 116, 180, 11, 75, 140, 43, 108, 172, 27, 91, 156, 59, 124, 188, 7, 71, 136, 39, 104, 168, 23, 87, 152, 55, 120, 184, 15, 79, 144, 47, 112, 176, 31, 95, 160, 63, 128, 192]; - - return (unsafe{*PERM193.get_unchecked((index % 193) as usize)} as u32 * 7189057 + - unsafe{*PERM193.get_unchecked(((index / 193) % 193) as usize)} as u32 * 37249 + - unsafe{*PERM193.get_unchecked(((index / 37249) % 193) as usize)} as u32 * 193 + - unsafe{*PERM193.get_unchecked(((index / 7189057) % 193) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (1387488001u32 as f32)); // Results in [0,1). -} - - -fn halton197(index: u32) -> f32 { - const PERM197: [u16; 197] = [0, 64, 133, 32, 101, 165, 16, 80, 149, 48, 117, 181, 8, 72, 141, 40, 109, 173, 24, 88, 157, 56, 125, 189, 96, 4, 68, 137, 36, 105, 169, 20, 84, 153, 52, 121, 185, 12, 76, 145, 44, 113, 177, 28, 92, 161, 60, 129, 193, 2, 66, 135, 34, 103, 167, 18, 82, 151, 50, 119, 183, 10, 74, 143, 42, 111, 175, 26, 90, 159, 58, 127, 191, 99, 6, 70, 139, 38, 107, 171, 22, 86, 155, 54, 123, 187, 14, 78, 147, 46, 115, 179, 30, 94, 163, 62, 131, 195, 98, 1, 65, 134, 33, 102, 166, 17, 81, 150, 49, 118, 182, 9, 73, 142, 41, 110, 174, 25, 89, 158, 57, 126, 190, 97, 5, 69, 138, 37, 106, 170, 21, 85, 154, 53, 122, 186, 13, 77, 146, 45, 114, 178, 29, 93, 162, 61, 130, 194, 3, 67, 136, 35, 104, 168, 19, 83, 152, 51, 120, 184, 11, 75, 144, 43, 112, 176, 27, 91, 160, 59, 128, 192, 100, 7, 71, 140, 39, 108, 172, 23, 87, 156, 55, 124, 188, 15, 79, 148, 47, 116, 180, 31, 95, 164, 63, 132, 196]; - - return (unsafe{*PERM197.get_unchecked((index % 197) as usize)} as u32 * 7645373 + - unsafe{*PERM197.get_unchecked(((index / 197) % 197) as usize)} as u32 * 38809 + - unsafe{*PERM197.get_unchecked(((index / 38809) % 197) as usize)} as u32 * 197 + - unsafe{*PERM197.get_unchecked(((index / 7645373) % 197) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (1506138481u32 as f32)); // Results in [0,1). -} - - -fn halton199(index: u32) -> f32 { - const PERM199: [u16; 199] = [0, 64, 135, 32, 103, 167, 16, 80, 151, 48, 119, 183, 8, 72, 143, 40, 111, 175, 24, 88, 159, 56, 127, 191, 96, 4, 68, 139, 36, 107, 171, 20, 84, 155, 52, 123, 187, 12, 76, 147, 44, 115, 179, 28, 92, 163, 60, 131, 195, 98, 2, 66, 137, 34, 105, 169, 18, 82, 153, 50, 121, 185, 10, 74, 145, 42, 113, 177, 26, 90, 161, 58, 129, 193, 101, 6, 70, 141, 38, 109, 173, 22, 86, 157, 54, 125, 189, 14, 78, 149, 46, 117, 181, 30, 94, 165, 62, 133, 197, 99, 1, 65, 136, 33, 104, 168, 17, 81, 152, 49, 120, 184, 9, 73, 144, 41, 112, 176, 25, 89, 160, 57, 128, 192, 97, 5, 69, 140, 37, 108, 172, 21, 85, 156, 53, 124, 188, 13, 77, 148, 45, 116, 180, 29, 93, 164, 61, 132, 196, 100, 3, 67, 138, 35, 106, 170, 19, 83, 154, 51, 122, 186, 11, 75, 146, 43, 114, 178, 27, 91, 162, 59, 130, 194, 102, 7, 71, 142, 39, 110, 174, 23, 87, 158, 55, 126, 190, 15, 79, 150, 47, 118, 182, 31, 95, 166, 63, 134, 198]; - - return (unsafe{*PERM199.get_unchecked((index % 199) as usize)} as u32 * 7880599 + - unsafe{*PERM199.get_unchecked(((index / 199) % 199) as usize)} as u32 * 39601 + - unsafe{*PERM199.get_unchecked(((index / 39601) % 199) as usize)} as u32 * 199 + - unsafe{*PERM199.get_unchecked(((index / 7880599) % 199) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (1568239201u32 as f32)); // Results in [0,1). -} - - -fn halton211(index: u32) -> f32 { - const PERM211: [u16; 211] = [0, 64, 147, 32, 115, 179, 96, 16, 80, 163, 48, 131, 195, 8, 72, 155, 40, 123, 187, 107, 24, 88, 171, 56, 139, 203, 4, 68, 151, 36, 119, 183, 100, 20, 84, 167, 52, 135, 199, 12, 76, 159, 44, 127, 191, 111, 28, 92, 175, 60, 143, 207, 104, 2, 66, 149, 34, 117, 181, 98, 18, 82, 165, 50, 133, 197, 10, 74, 157, 42, 125, 189, 109, 26, 90, 173, 58, 141, 205, 6, 70, 153, 38, 121, 185, 102, 22, 86, 169, 54, 137, 201, 14, 78, 161, 46, 129, 193, 113, 30, 94, 177, 62, 145, 209, 105, 1, 65, 148, 33, 116, 180, 97, 17, 81, 164, 49, 132, 196, 9, 73, 156, 41, 124, 188, 108, 25, 89, 172, 57, 140, 204, 5, 69, 152, 37, 120, 184, 101, 21, 85, 168, 53, 136, 200, 13, 77, 160, 45, 128, 192, 112, 29, 93, 176, 61, 144, 208, 106, 3, 67, 150, 35, 118, 182, 99, 19, 83, 166, 51, 134, 198, 11, 75, 158, 43, 126, 190, 110, 27, 91, 174, 59, 142, 206, 7, 71, 154, 39, 122, 186, 103, 23, 87, 170, 55, 138, 202, 15, 79, 162, 47, 130, 194, 114, 31, 95, 178, 63, 146, 210]; - - return (unsafe{*PERM211.get_unchecked((index % 211) as usize)} as u32 * 9393931 + - unsafe{*PERM211.get_unchecked(((index / 211) % 211) as usize)} as u32 * 44521 + - unsafe{*PERM211.get_unchecked(((index / 44521) % 211) as usize)} as u32 * 211 + - unsafe{*PERM211.get_unchecked(((index / 9393931) % 211) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (1982119441u32 as f32)); // Results in [0,1). -} - - -fn halton223(index: u32) -> f32 { - const PERM223: [u16; 223] = [0, 64, 159, 32, 127, 191, 96, 16, 80, 175, 48, 143, 207, 104, 8, 72, 167, 40, 135, 199, 119, 24, 88, 183, 56, 151, 215, 108, 4, 68, 163, 36, 131, 195, 100, 20, 84, 179, 52, 147, 211, 115, 12, 76, 171, 44, 139, 203, 123, 28, 92, 187, 60, 155, 219, 110, 2, 66, 161, 34, 129, 193, 98, 18, 82, 177, 50, 145, 209, 106, 10, 74, 169, 42, 137, 201, 121, 26, 90, 185, 58, 153, 217, 113, 6, 70, 165, 38, 133, 197, 102, 22, 86, 181, 54, 149, 213, 117, 14, 78, 173, 46, 141, 205, 125, 30, 94, 189, 62, 157, 221, 111, 1, 65, 160, 33, 128, 192, 97, 17, 81, 176, 49, 144, 208, 105, 9, 73, 168, 41, 136, 200, 120, 25, 89, 184, 57, 152, 216, 109, 5, 69, 164, 37, 132, 196, 101, 21, 85, 180, 53, 148, 212, 116, 13, 77, 172, 45, 140, 204, 124, 29, 93, 188, 61, 156, 220, 112, 3, 67, 162, 35, 130, 194, 99, 19, 83, 178, 51, 146, 210, 107, 11, 75, 170, 43, 138, 202, 122, 27, 91, 186, 59, 154, 218, 114, 7, 71, 166, 39, 134, 198, 103, 23, 87, 182, 55, 150, 214, 118, 15, 79, 174, 47, 142, 206, 126, 31, 95, 190, 63, 158, 222]; - - return (unsafe{*PERM223.get_unchecked((index % 223) as usize)} as u32 * 11089567 + - unsafe{*PERM223.get_unchecked(((index / 223) % 223) as usize)} as u32 * 49729 + - unsafe{*PERM223.get_unchecked(((index / 49729) % 223) as usize)} as u32 * 223 + - unsafe{*PERM223.get_unchecked(((index / 11089567) % 223) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (2472973441u32 as f32)); // Results in [0,1). -} - - -fn halton227(index: u32) -> f32 { - const PERM227: [u16; 227] = [0, 64, 163, 96, 32, 131, 195, 16, 80, 179, 115, 48, 147, 211, 8, 72, 171, 104, 40, 139, 203, 24, 88, 187, 123, 56, 155, 219, 4, 68, 167, 100, 36, 135, 199, 20, 84, 183, 119, 52, 151, 215, 12, 76, 175, 108, 44, 143, 207, 28, 92, 191, 127, 60, 159, 223, 112, 2, 66, 165, 98, 34, 133, 197, 18, 82, 181, 117, 50, 149, 213, 10, 74, 173, 106, 42, 141, 205, 26, 90, 189, 125, 58, 157, 221, 6, 70, 169, 102, 38, 137, 201, 22, 86, 185, 121, 54, 153, 217, 14, 78, 177, 110, 46, 145, 209, 30, 94, 193, 129, 62, 161, 225, 113, 1, 65, 164, 97, 33, 132, 196, 17, 81, 180, 116, 49, 148, 212, 9, 73, 172, 105, 41, 140, 204, 25, 89, 188, 124, 57, 156, 220, 5, 69, 168, 101, 37, 136, 200, 21, 85, 184, 120, 53, 152, 216, 13, 77, 176, 109, 45, 144, 208, 29, 93, 192, 128, 61, 160, 224, 114, 3, 67, 166, 99, 35, 134, 198, 19, 83, 182, 118, 51, 150, 214, 11, 75, 174, 107, 43, 142, 206, 27, 91, 190, 126, 59, 158, 222, 7, 71, 170, 103, 39, 138, 202, 23, 87, 186, 122, 55, 154, 218, 15, 79, 178, 111, 47, 146, 210, 31, 95, 194, 130, 63, 162, 226]; - - return (unsafe{*PERM227.get_unchecked((index % 227) as usize)} as u32 * 11697083 + - unsafe{*PERM227.get_unchecked(((index / 227) % 227) as usize)} as u32 * 51529 + - unsafe{*PERM227.get_unchecked(((index / 51529) % 227) as usize)} as u32 * 227 + - unsafe{*PERM227.get_unchecked(((index / 11697083) % 227) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (2655237841u32 as f32)); // Results in [0,1). -} - - -fn halton229(index: u32) -> f32 { - const PERM229: [u16; 229] = [0, 64, 165, 96, 32, 133, 197, 16, 80, 181, 117, 48, 149, 213, 8, 72, 173, 104, 40, 141, 205, 24, 88, 189, 125, 56, 157, 221, 112, 4, 68, 169, 100, 36, 137, 201, 20, 84, 185, 121, 52, 153, 217, 12, 76, 177, 108, 44, 145, 209, 28, 92, 193, 129, 60, 161, 225, 2, 66, 167, 98, 34, 135, 199, 18, 82, 183, 119, 50, 151, 215, 10, 74, 175, 106, 42, 143, 207, 26, 90, 191, 127, 58, 159, 223, 115, 6, 70, 171, 102, 38, 139, 203, 22, 86, 187, 123, 54, 155, 219, 14, 78, 179, 110, 46, 147, 211, 30, 94, 195, 131, 62, 163, 227, 114, 1, 65, 166, 97, 33, 134, 198, 17, 81, 182, 118, 49, 150, 214, 9, 73, 174, 105, 41, 142, 206, 25, 89, 190, 126, 57, 158, 222, 113, 5, 69, 170, 101, 37, 138, 202, 21, 85, 186, 122, 53, 154, 218, 13, 77, 178, 109, 45, 146, 210, 29, 93, 194, 130, 61, 162, 226, 3, 67, 168, 99, 35, 136, 200, 19, 83, 184, 120, 51, 152, 216, 11, 75, 176, 107, 43, 144, 208, 27, 91, 192, 128, 59, 160, 224, 116, 7, 71, 172, 103, 39, 140, 204, 23, 87, 188, 124, 55, 156, 220, 15, 79, 180, 111, 47, 148, 212, 31, 95, 196, 132, 63, 164, 228]; - - return (unsafe{*PERM229.get_unchecked((index % 229) as usize)} as u32 * 12008989 + - unsafe{*PERM229.get_unchecked(((index / 229) % 229) as usize)} as u32 * 52441 + - unsafe{*PERM229.get_unchecked(((index / 52441) % 229) as usize)} as u32 * 229 + - unsafe{*PERM229.get_unchecked(((index / 12008989) % 229) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (2750058481u32 as f32)); // Results in [0,1). -} - - -fn halton233(index: u32) -> f32 { - const PERM233: [u16; 233] = [0, 64, 169, 96, 32, 137, 201, 16, 80, 185, 121, 48, 153, 217, 112, 8, 72, 177, 104, 40, 145, 209, 24, 88, 193, 129, 56, 161, 225, 4, 68, 173, 100, 36, 141, 205, 20, 84, 189, 125, 52, 157, 221, 117, 12, 76, 181, 108, 44, 149, 213, 28, 92, 197, 133, 60, 165, 229, 2, 66, 171, 98, 34, 139, 203, 18, 82, 187, 123, 50, 155, 219, 114, 10, 74, 179, 106, 42, 147, 211, 26, 90, 195, 131, 58, 163, 227, 6, 70, 175, 102, 38, 143, 207, 22, 86, 191, 127, 54, 159, 223, 119, 14, 78, 183, 110, 46, 151, 215, 30, 94, 199, 135, 62, 167, 231, 116, 1, 65, 170, 97, 33, 138, 202, 17, 81, 186, 122, 49, 154, 218, 113, 9, 73, 178, 105, 41, 146, 210, 25, 89, 194, 130, 57, 162, 226, 5, 69, 174, 101, 37, 142, 206, 21, 85, 190, 126, 53, 158, 222, 118, 13, 77, 182, 109, 45, 150, 214, 29, 93, 198, 134, 61, 166, 230, 3, 67, 172, 99, 35, 140, 204, 19, 83, 188, 124, 51, 156, 220, 115, 11, 75, 180, 107, 43, 148, 212, 27, 91, 196, 132, 59, 164, 228, 7, 71, 176, 103, 39, 144, 208, 23, 87, 192, 128, 55, 160, 224, 120, 15, 79, 184, 111, 47, 152, 216, 31, 95, 200, 136, 63, 168, 232]; - - return (unsafe{*PERM233.get_unchecked((index % 233) as usize)} as u32 * 12649337 + - unsafe{*PERM233.get_unchecked(((index / 233) % 233) as usize)} as u32 * 54289 + - unsafe{*PERM233.get_unchecked(((index / 54289) % 233) as usize)} as u32 * 233 + - unsafe{*PERM233.get_unchecked(((index / 12649337) % 233) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (2947295521u32 as f32)); // Results in [0,1). -} - - -fn halton239(index: u32) -> f32 { - const PERM239: [u16; 239] = [0, 64, 175, 96, 32, 143, 207, 16, 80, 191, 127, 48, 159, 223, 112, 8, 72, 183, 104, 40, 151, 215, 24, 88, 199, 135, 56, 167, 231, 116, 4, 68, 179, 100, 36, 147, 211, 20, 84, 195, 131, 52, 163, 227, 123, 12, 76, 187, 108, 44, 155, 219, 28, 92, 203, 139, 60, 171, 235, 118, 2, 66, 177, 98, 34, 145, 209, 18, 82, 193, 129, 50, 161, 225, 114, 10, 74, 185, 106, 42, 153, 217, 26, 90, 201, 137, 58, 169, 233, 121, 6, 70, 181, 102, 38, 149, 213, 22, 86, 197, 133, 54, 165, 229, 125, 14, 78, 189, 110, 46, 157, 221, 30, 94, 205, 141, 62, 173, 237, 119, 1, 65, 176, 97, 33, 144, 208, 17, 81, 192, 128, 49, 160, 224, 113, 9, 73, 184, 105, 41, 152, 216, 25, 89, 200, 136, 57, 168, 232, 117, 5, 69, 180, 101, 37, 148, 212, 21, 85, 196, 132, 53, 164, 228, 124, 13, 77, 188, 109, 45, 156, 220, 29, 93, 204, 140, 61, 172, 236, 120, 3, 67, 178, 99, 35, 146, 210, 19, 83, 194, 130, 51, 162, 226, 115, 11, 75, 186, 107, 43, 154, 218, 27, 91, 202, 138, 59, 170, 234, 122, 7, 71, 182, 103, 39, 150, 214, 23, 87, 198, 134, 55, 166, 230, 126, 15, 79, 190, 111, 47, 158, 222, 31, 95, 206, 142, 63, 174, 238]; - - return (unsafe{*PERM239.get_unchecked((index % 239) as usize)} as u32 * 13651919 + - unsafe{*PERM239.get_unchecked(((index / 239) % 239) as usize)} as u32 * 57121 + - unsafe{*PERM239.get_unchecked(((index / 57121) % 239) as usize)} as u32 * 239 + - unsafe{*PERM239.get_unchecked(((index / 13651919) % 239) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (3262808641u32 as f32)); // Results in [0,1). -} - - -fn halton241(index: u32) -> f32 { - const PERM241: [u16; 241] = [0, 64, 177, 96, 32, 145, 209, 112, 16, 80, 193, 129, 48, 161, 225, 8, 72, 185, 104, 40, 153, 217, 121, 24, 88, 201, 137, 56, 169, 233, 4, 68, 181, 100, 36, 149, 213, 116, 20, 84, 197, 133, 52, 165, 229, 12, 76, 189, 108, 44, 157, 221, 125, 28, 92, 205, 141, 60, 173, 237, 2, 66, 179, 98, 34, 147, 211, 114, 18, 82, 195, 131, 50, 163, 227, 10, 74, 187, 106, 42, 155, 219, 123, 26, 90, 203, 139, 58, 171, 235, 6, 70, 183, 102, 38, 151, 215, 118, 22, 86, 199, 135, 54, 167, 231, 14, 78, 191, 110, 46, 159, 223, 127, 30, 94, 207, 143, 62, 175, 239, 120, 1, 65, 178, 97, 33, 146, 210, 113, 17, 81, 194, 130, 49, 162, 226, 9, 73, 186, 105, 41, 154, 218, 122, 25, 89, 202, 138, 57, 170, 234, 5, 69, 182, 101, 37, 150, 214, 117, 21, 85, 198, 134, 53, 166, 230, 13, 77, 190, 109, 45, 158, 222, 126, 29, 93, 206, 142, 61, 174, 238, 3, 67, 180, 99, 35, 148, 212, 115, 19, 83, 196, 132, 51, 164, 228, 11, 75, 188, 107, 43, 156, 220, 124, 27, 91, 204, 140, 59, 172, 236, 7, 71, 184, 103, 39, 152, 216, 119, 23, 87, 200, 136, 55, 168, 232, 15, 79, 192, 111, 47, 160, 224, 128, 31, 95, 208, 144, 63, 176, 240]; - - return (unsafe{*PERM241.get_unchecked((index % 241) as usize)} as u32 * 13997521 + - unsafe{*PERM241.get_unchecked(((index / 241) % 241) as usize)} as u32 * 58081 + - unsafe{*PERM241.get_unchecked(((index / 58081) % 241) as usize)} as u32 * 241 + - unsafe{*PERM241.get_unchecked(((index / 13997521) % 241) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (3373402561u32 as f32)); // Results in [0,1). -} - - -fn halton251(index: u32) -> f32 { - const PERM251: [u16; 251] = [0, 64, 187, 96, 32, 155, 219, 112, 16, 80, 203, 139, 48, 171, 235, 120, 8, 72, 195, 104, 40, 163, 227, 131, 24, 88, 211, 147, 56, 179, 243, 4, 68, 191, 100, 36, 159, 223, 116, 20, 84, 207, 143, 52, 175, 239, 127, 12, 76, 199, 108, 44, 167, 231, 135, 28, 92, 215, 151, 60, 183, 247, 124, 2, 66, 189, 98, 34, 157, 221, 114, 18, 82, 205, 141, 50, 173, 237, 122, 10, 74, 197, 106, 42, 165, 229, 133, 26, 90, 213, 149, 58, 181, 245, 6, 70, 193, 102, 38, 161, 225, 118, 22, 86, 209, 145, 54, 177, 241, 129, 14, 78, 201, 110, 46, 169, 233, 137, 30, 94, 217, 153, 62, 185, 249, 125, 1, 65, 188, 97, 33, 156, 220, 113, 17, 81, 204, 140, 49, 172, 236, 121, 9, 73, 196, 105, 41, 164, 228, 132, 25, 89, 212, 148, 57, 180, 244, 5, 69, 192, 101, 37, 160, 224, 117, 21, 85, 208, 144, 53, 176, 240, 128, 13, 77, 200, 109, 45, 168, 232, 136, 29, 93, 216, 152, 61, 184, 248, 126, 3, 67, 190, 99, 35, 158, 222, 115, 19, 83, 206, 142, 51, 174, 238, 123, 11, 75, 198, 107, 43, 166, 230, 134, 27, 91, 214, 150, 59, 182, 246, 7, 71, 194, 103, 39, 162, 226, 119, 23, 87, 210, 146, 55, 178, 242, 130, 15, 79, 202, 111, 47, 170, 234, 138, 31, 95, 218, 154, 63, 186, 250]; - - return (unsafe{*PERM251.get_unchecked((index % 251) as usize)} as u32 * 15813251 + - unsafe{*PERM251.get_unchecked(((index / 251) % 251) as usize)} as u32 * 63001 + - unsafe{*PERM251.get_unchecked(((index / 63001) % 251) as usize)} as u32 * 251 + - unsafe{*PERM251.get_unchecked(((index / 15813251) % 251) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (3969126001u32 as f32)); // Results in [0,1). -} - - -fn halton257(index: u32) -> f32 { - const PERM257: [u16; 257] = [0, 129, 64, 193, 32, 161, 96, 225, 16, 145, 80, 209, 48, 177, 112, 241, 8, 137, 72, 201, 40, 169, 104, 233, 24, 153, 88, 217, 56, 185, 120, 249, 4, 133, 68, 197, 36, 165, 100, 229, 20, 149, 84, 213, 52, 181, 116, 245, 12, 141, 76, 205, 44, 173, 108, 237, 28, 157, 92, 221, 60, 189, 124, 253, 2, 131, 66, 195, 34, 163, 98, 227, 18, 147, 82, 211, 50, 179, 114, 243, 10, 139, 74, 203, 42, 171, 106, 235, 26, 155, 90, 219, 58, 187, 122, 251, 6, 135, 70, 199, 38, 167, 102, 231, 22, 151, 86, 215, 54, 183, 118, 247, 14, 143, 78, 207, 46, 175, 110, 239, 30, 159, 94, 223, 62, 191, 126, 255, 128, 1, 130, 65, 194, 33, 162, 97, 226, 17, 146, 81, 210, 49, 178, 113, 242, 9, 138, 73, 202, 41, 170, 105, 234, 25, 154, 89, 218, 57, 186, 121, 250, 5, 134, 69, 198, 37, 166, 101, 230, 21, 150, 85, 214, 53, 182, 117, 246, 13, 142, 77, 206, 45, 174, 109, 238, 29, 158, 93, 222, 61, 190, 125, 254, 3, 132, 67, 196, 35, 164, 99, 228, 19, 148, 83, 212, 51, 180, 115, 244, 11, 140, 75, 204, 43, 172, 107, 236, 27, 156, 91, 220, 59, 188, 123, 252, 7, 136, 71, 200, 39, 168, 103, 232, 23, 152, 87, 216, 55, 184, 119, 248, 15, 144, 79, 208, 47, 176, 111, 240, 31, 160, 95, 224, 63, 192, 127, 256]; - - return (unsafe{*PERM257.get_unchecked((index % 257) as usize)} as u32 * 66049 + - unsafe{*PERM257.get_unchecked(((index / 257) % 257) as usize)} as u32 * 257 + - unsafe{*PERM257.get_unchecked(((index / 66049) % 257) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (16974593u32 as f32)); // Results in [0,1). -} - - -fn halton263(index: u32) -> f32 { - const PERM263: [u16; 263] = [0, 135, 64, 199, 32, 167, 96, 231, 16, 151, 80, 215, 48, 183, 112, 247, 8, 143, 72, 207, 40, 175, 104, 239, 24, 159, 88, 223, 56, 191, 120, 255, 128, 4, 139, 68, 203, 36, 171, 100, 235, 20, 155, 84, 219, 52, 187, 116, 251, 12, 147, 76, 211, 44, 179, 108, 243, 28, 163, 92, 227, 60, 195, 124, 259, 130, 2, 137, 66, 201, 34, 169, 98, 233, 18, 153, 82, 217, 50, 185, 114, 249, 10, 145, 74, 209, 42, 177, 106, 241, 26, 161, 90, 225, 58, 193, 122, 257, 133, 6, 141, 70, 205, 38, 173, 102, 237, 22, 157, 86, 221, 54, 189, 118, 253, 14, 149, 78, 213, 46, 181, 110, 245, 30, 165, 94, 229, 62, 197, 126, 261, 131, 1, 136, 65, 200, 33, 168, 97, 232, 17, 152, 81, 216, 49, 184, 113, 248, 9, 144, 73, 208, 41, 176, 105, 240, 25, 160, 89, 224, 57, 192, 121, 256, 129, 5, 140, 69, 204, 37, 172, 101, 236, 21, 156, 85, 220, 53, 188, 117, 252, 13, 148, 77, 212, 45, 180, 109, 244, 29, 164, 93, 228, 61, 196, 125, 260, 132, 3, 138, 67, 202, 35, 170, 99, 234, 19, 154, 83, 218, 51, 186, 115, 250, 11, 146, 75, 210, 43, 178, 107, 242, 27, 162, 91, 226, 59, 194, 123, 258, 134, 7, 142, 71, 206, 39, 174, 103, 238, 23, 158, 87, 222, 55, 190, 119, 254, 15, 150, 79, 214, 47, 182, 111, 246, 31, 166, 95, 230, 63, 198, 127, 262]; - - return (unsafe{*PERM263.get_unchecked((index % 263) as usize)} as u32 * 69169 + - unsafe{*PERM263.get_unchecked(((index / 263) % 263) as usize)} as u32 * 263 + - unsafe{*PERM263.get_unchecked(((index / 69169) % 263) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (18191447u32 as f32)); // Results in [0,1). -} - - -fn halton269(index: u32) -> f32 { - const PERM269: [u16; 269] = [0, 141, 64, 205, 32, 173, 96, 237, 16, 157, 80, 221, 48, 189, 112, 253, 128, 8, 149, 72, 213, 40, 181, 104, 245, 24, 165, 88, 229, 56, 197, 120, 261, 132, 4, 145, 68, 209, 36, 177, 100, 241, 20, 161, 84, 225, 52, 193, 116, 257, 137, 12, 153, 76, 217, 44, 185, 108, 249, 28, 169, 92, 233, 60, 201, 124, 265, 2, 143, 66, 207, 34, 175, 98, 239, 18, 159, 82, 223, 50, 191, 114, 255, 130, 10, 151, 74, 215, 42, 183, 106, 247, 26, 167, 90, 231, 58, 199, 122, 263, 135, 6, 147, 70, 211, 38, 179, 102, 243, 22, 163, 86, 227, 54, 195, 118, 259, 139, 14, 155, 78, 219, 46, 187, 110, 251, 30, 171, 94, 235, 62, 203, 126, 267, 134, 1, 142, 65, 206, 33, 174, 97, 238, 17, 158, 81, 222, 49, 190, 113, 254, 129, 9, 150, 73, 214, 41, 182, 105, 246, 25, 166, 89, 230, 57, 198, 121, 262, 133, 5, 146, 69, 210, 37, 178, 101, 242, 21, 162, 85, 226, 53, 194, 117, 258, 138, 13, 154, 77, 218, 45, 186, 109, 250, 29, 170, 93, 234, 61, 202, 125, 266, 3, 144, 67, 208, 35, 176, 99, 240, 19, 160, 83, 224, 51, 192, 115, 256, 131, 11, 152, 75, 216, 43, 184, 107, 248, 27, 168, 91, 232, 59, 200, 123, 264, 136, 7, 148, 71, 212, 39, 180, 103, 244, 23, 164, 87, 228, 55, 196, 119, 260, 140, 15, 156, 79, 220, 47, 188, 111, 252, 31, 172, 95, 236, 63, 204, 127, 268]; - - return (unsafe{*PERM269.get_unchecked((index % 269) as usize)} as u32 * 72361 + - unsafe{*PERM269.get_unchecked(((index / 269) % 269) as usize)} as u32 * 269 + - unsafe{*PERM269.get_unchecked(((index / 72361) % 269) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (19465109u32 as f32)); // Results in [0,1). -} - - -fn halton271(index: u32) -> f32 { - const PERM271: [u16; 271] = [0, 143, 64, 207, 32, 175, 96, 239, 16, 159, 80, 223, 48, 191, 112, 255, 128, 8, 151, 72, 215, 40, 183, 104, 247, 24, 167, 88, 231, 56, 199, 120, 263, 132, 4, 147, 68, 211, 36, 179, 100, 243, 20, 163, 84, 227, 52, 195, 116, 259, 139, 12, 155, 76, 219, 44, 187, 108, 251, 28, 171, 92, 235, 60, 203, 124, 267, 134, 2, 145, 66, 209, 34, 177, 98, 241, 18, 161, 82, 225, 50, 193, 114, 257, 130, 10, 153, 74, 217, 42, 185, 106, 249, 26, 169, 90, 233, 58, 201, 122, 265, 137, 6, 149, 70, 213, 38, 181, 102, 245, 22, 165, 86, 229, 54, 197, 118, 261, 141, 14, 157, 78, 221, 46, 189, 110, 253, 30, 173, 94, 237, 62, 205, 126, 269, 135, 1, 144, 65, 208, 33, 176, 97, 240, 17, 160, 81, 224, 49, 192, 113, 256, 129, 9, 152, 73, 216, 41, 184, 105, 248, 25, 168, 89, 232, 57, 200, 121, 264, 133, 5, 148, 69, 212, 37, 180, 101, 244, 21, 164, 85, 228, 53, 196, 117, 260, 140, 13, 156, 77, 220, 45, 188, 109, 252, 29, 172, 93, 236, 61, 204, 125, 268, 136, 3, 146, 67, 210, 35, 178, 99, 242, 19, 162, 83, 226, 51, 194, 115, 258, 131, 11, 154, 75, 218, 43, 186, 107, 250, 27, 170, 91, 234, 59, 202, 123, 266, 138, 7, 150, 71, 214, 39, 182, 103, 246, 23, 166, 87, 230, 55, 198, 119, 262, 142, 15, 158, 79, 222, 47, 190, 111, 254, 31, 174, 95, 238, 63, 206, 127, 270]; - - return (unsafe{*PERM271.get_unchecked((index % 271) as usize)} as u32 * 73441 + - unsafe{*PERM271.get_unchecked(((index / 271) % 271) as usize)} as u32 * 271 + - unsafe{*PERM271.get_unchecked(((index / 73441) % 271) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (19902511u32 as f32)); // Results in [0,1). -} - - -fn halton277(index: u32) -> f32 { - const PERM277: [u16; 277] = [0, 149, 64, 213, 32, 181, 96, 245, 128, 16, 165, 80, 229, 48, 197, 112, 261, 8, 157, 72, 221, 40, 189, 104, 253, 141, 24, 173, 88, 237, 56, 205, 120, 269, 136, 4, 153, 68, 217, 36, 185, 100, 249, 132, 20, 169, 84, 233, 52, 201, 116, 265, 12, 161, 76, 225, 44, 193, 108, 257, 145, 28, 177, 92, 241, 60, 209, 124, 273, 2, 151, 66, 215, 34, 183, 98, 247, 130, 18, 167, 82, 231, 50, 199, 114, 263, 10, 159, 74, 223, 42, 191, 106, 255, 143, 26, 175, 90, 239, 58, 207, 122, 271, 139, 6, 155, 70, 219, 38, 187, 102, 251, 134, 22, 171, 86, 235, 54, 203, 118, 267, 14, 163, 78, 227, 46, 195, 110, 259, 147, 30, 179, 94, 243, 62, 211, 126, 275, 138, 1, 150, 65, 214, 33, 182, 97, 246, 129, 17, 166, 81, 230, 49, 198, 113, 262, 9, 158, 73, 222, 41, 190, 105, 254, 142, 25, 174, 89, 238, 57, 206, 121, 270, 137, 5, 154, 69, 218, 37, 186, 101, 250, 133, 21, 170, 85, 234, 53, 202, 117, 266, 13, 162, 77, 226, 45, 194, 109, 258, 146, 29, 178, 93, 242, 61, 210, 125, 274, 3, 152, 67, 216, 35, 184, 99, 248, 131, 19, 168, 83, 232, 51, 200, 115, 264, 11, 160, 75, 224, 43, 192, 107, 256, 144, 27, 176, 91, 240, 59, 208, 123, 272, 140, 7, 156, 71, 220, 39, 188, 103, 252, 135, 23, 172, 87, 236, 55, 204, 119, 268, 15, 164, 79, 228, 47, 196, 111, 260, 148, 31, 180, 95, 244, 63, 212, 127, 276]; - - return (unsafe{*PERM277.get_unchecked((index % 277) as usize)} as u32 * 76729 + - unsafe{*PERM277.get_unchecked(((index / 277) % 277) as usize)} as u32 * 277 + - unsafe{*PERM277.get_unchecked(((index / 76729) % 277) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (21253933u32 as f32)); // Results in [0,1). -} - - -fn halton281(index: u32) -> f32 { - const PERM281: [u16; 281] = [0, 153, 64, 217, 32, 185, 96, 249, 128, 16, 169, 80, 233, 48, 201, 112, 265, 136, 8, 161, 72, 225, 40, 193, 104, 257, 145, 24, 177, 88, 241, 56, 209, 120, 273, 4, 157, 68, 221, 36, 189, 100, 253, 132, 20, 173, 84, 237, 52, 205, 116, 269, 141, 12, 165, 76, 229, 44, 197, 108, 261, 149, 28, 181, 92, 245, 60, 213, 124, 277, 2, 155, 66, 219, 34, 187, 98, 251, 130, 18, 171, 82, 235, 50, 203, 114, 267, 138, 10, 163, 74, 227, 42, 195, 106, 259, 147, 26, 179, 90, 243, 58, 211, 122, 275, 6, 159, 70, 223, 38, 191, 102, 255, 134, 22, 175, 86, 239, 54, 207, 118, 271, 143, 14, 167, 78, 231, 46, 199, 110, 263, 151, 30, 183, 94, 247, 62, 215, 126, 279, 140, 1, 154, 65, 218, 33, 186, 97, 250, 129, 17, 170, 81, 234, 49, 202, 113, 266, 137, 9, 162, 73, 226, 41, 194, 105, 258, 146, 25, 178, 89, 242, 57, 210, 121, 274, 5, 158, 69, 222, 37, 190, 101, 254, 133, 21, 174, 85, 238, 53, 206, 117, 270, 142, 13, 166, 77, 230, 45, 198, 109, 262, 150, 29, 182, 93, 246, 61, 214, 125, 278, 3, 156, 67, 220, 35, 188, 99, 252, 131, 19, 172, 83, 236, 51, 204, 115, 268, 139, 11, 164, 75, 228, 43, 196, 107, 260, 148, 27, 180, 91, 244, 59, 212, 123, 276, 7, 160, 71, 224, 39, 192, 103, 256, 135, 23, 176, 87, 240, 55, 208, 119, 272, 144, 15, 168, 79, 232, 47, 200, 111, 264, 152, 31, 184, 95, 248, 63, 216, 127, 280]; - - return (unsafe{*PERM281.get_unchecked((index % 281) as usize)} as u32 * 78961 + - unsafe{*PERM281.get_unchecked(((index / 281) % 281) as usize)} as u32 * 281 + - unsafe{*PERM281.get_unchecked(((index / 78961) % 281) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (22188041u32 as f32)); // Results in [0,1). -} - - -fn halton283(index: u32) -> f32 { - const PERM283: [u16; 283] = [0, 155, 64, 219, 32, 187, 96, 251, 128, 16, 171, 80, 235, 48, 203, 112, 267, 136, 8, 163, 72, 227, 40, 195, 104, 259, 147, 24, 179, 88, 243, 56, 211, 120, 275, 4, 159, 68, 223, 36, 191, 100, 255, 132, 20, 175, 84, 239, 52, 207, 116, 271, 143, 12, 167, 76, 231, 44, 199, 108, 263, 151, 28, 183, 92, 247, 60, 215, 124, 279, 140, 2, 157, 66, 221, 34, 189, 98, 253, 130, 18, 173, 82, 237, 50, 205, 114, 269, 138, 10, 165, 74, 229, 42, 197, 106, 261, 149, 26, 181, 90, 245, 58, 213, 122, 277, 6, 161, 70, 225, 38, 193, 102, 257, 134, 22, 177, 86, 241, 54, 209, 118, 273, 145, 14, 169, 78, 233, 46, 201, 110, 265, 153, 30, 185, 94, 249, 62, 217, 126, 281, 141, 1, 156, 65, 220, 33, 188, 97, 252, 129, 17, 172, 81, 236, 49, 204, 113, 268, 137, 9, 164, 73, 228, 41, 196, 105, 260, 148, 25, 180, 89, 244, 57, 212, 121, 276, 5, 160, 69, 224, 37, 192, 101, 256, 133, 21, 176, 85, 240, 53, 208, 117, 272, 144, 13, 168, 77, 232, 45, 200, 109, 264, 152, 29, 184, 93, 248, 61, 216, 125, 280, 142, 3, 158, 67, 222, 35, 190, 99, 254, 131, 19, 174, 83, 238, 51, 206, 115, 270, 139, 11, 166, 75, 230, 43, 198, 107, 262, 150, 27, 182, 91, 246, 59, 214, 123, 278, 7, 162, 71, 226, 39, 194, 103, 258, 135, 23, 178, 87, 242, 55, 210, 119, 274, 146, 15, 170, 79, 234, 47, 202, 111, 266, 154, 31, 186, 95, 250, 63, 218, 127, 282]; - - return (unsafe{*PERM283.get_unchecked((index % 283) as usize)} as u32 * 80089 + - unsafe{*PERM283.get_unchecked(((index / 283) % 283) as usize)} as u32 * 283 + - unsafe{*PERM283.get_unchecked(((index / 80089) % 283) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (22665187u32 as f32)); // Results in [0,1). -} - - -fn halton293(index: u32) -> f32 { - const PERM293: [u16; 293] = [0, 165, 64, 229, 128, 32, 197, 96, 261, 16, 181, 80, 245, 149, 48, 213, 112, 277, 8, 173, 72, 237, 136, 40, 205, 104, 269, 24, 189, 88, 253, 157, 56, 221, 120, 285, 144, 4, 169, 68, 233, 132, 36, 201, 100, 265, 20, 185, 84, 249, 153, 52, 217, 116, 281, 12, 177, 76, 241, 140, 44, 209, 108, 273, 28, 193, 92, 257, 161, 60, 225, 124, 289, 2, 167, 66, 231, 130, 34, 199, 98, 263, 18, 183, 82, 247, 151, 50, 215, 114, 279, 10, 175, 74, 239, 138, 42, 207, 106, 271, 26, 191, 90, 255, 159, 58, 223, 122, 287, 147, 6, 171, 70, 235, 134, 38, 203, 102, 267, 22, 187, 86, 251, 155, 54, 219, 118, 283, 14, 179, 78, 243, 142, 46, 211, 110, 275, 30, 195, 94, 259, 163, 62, 227, 126, 291, 146, 1, 166, 65, 230, 129, 33, 198, 97, 262, 17, 182, 81, 246, 150, 49, 214, 113, 278, 9, 174, 73, 238, 137, 41, 206, 105, 270, 25, 190, 89, 254, 158, 57, 222, 121, 286, 145, 5, 170, 69, 234, 133, 37, 202, 101, 266, 21, 186, 85, 250, 154, 53, 218, 117, 282, 13, 178, 77, 242, 141, 45, 210, 109, 274, 29, 194, 93, 258, 162, 61, 226, 125, 290, 3, 168, 67, 232, 131, 35, 200, 99, 264, 19, 184, 83, 248, 152, 51, 216, 115, 280, 11, 176, 75, 240, 139, 43, 208, 107, 272, 27, 192, 91, 256, 160, 59, 224, 123, 288, 148, 7, 172, 71, 236, 135, 39, 204, 103, 268, 23, 188, 87, 252, 156, 55, 220, 119, 284, 15, 180, 79, 244, 143, 47, 212, 111, 276, 31, 196, 95, 260, 164, 63, 228, 127, 292]; - - return (unsafe{*PERM293.get_unchecked((index % 293) as usize)} as u32 * 85849 + - unsafe{*PERM293.get_unchecked(((index / 293) % 293) as usize)} as u32 * 293 + - unsafe{*PERM293.get_unchecked(((index / 85849) % 293) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (25153757u32 as f32)); // Results in [0,1). -} - - -fn halton307(index: u32) -> f32 { - const PERM307: [u16; 307] = [0, 179, 64, 243, 128, 32, 211, 96, 275, 144, 16, 195, 80, 259, 163, 48, 227, 112, 291, 8, 187, 72, 251, 136, 40, 219, 104, 283, 155, 24, 203, 88, 267, 171, 56, 235, 120, 299, 4, 183, 68, 247, 132, 36, 215, 100, 279, 148, 20, 199, 84, 263, 167, 52, 231, 116, 295, 12, 191, 76, 255, 140, 44, 223, 108, 287, 159, 28, 207, 92, 271, 175, 60, 239, 124, 303, 152, 2, 181, 66, 245, 130, 34, 213, 98, 277, 146, 18, 197, 82, 261, 165, 50, 229, 114, 293, 10, 189, 74, 253, 138, 42, 221, 106, 285, 157, 26, 205, 90, 269, 173, 58, 237, 122, 301, 6, 185, 70, 249, 134, 38, 217, 102, 281, 150, 22, 201, 86, 265, 169, 54, 233, 118, 297, 14, 193, 78, 257, 142, 46, 225, 110, 289, 161, 30, 209, 94, 273, 177, 62, 241, 126, 305, 153, 1, 180, 65, 244, 129, 33, 212, 97, 276, 145, 17, 196, 81, 260, 164, 49, 228, 113, 292, 9, 188, 73, 252, 137, 41, 220, 105, 284, 156, 25, 204, 89, 268, 172, 57, 236, 121, 300, 5, 184, 69, 248, 133, 37, 216, 101, 280, 149, 21, 200, 85, 264, 168, 53, 232, 117, 296, 13, 192, 77, 256, 141, 45, 224, 109, 288, 160, 29, 208, 93, 272, 176, 61, 240, 125, 304, 154, 3, 182, 67, 246, 131, 35, 214, 99, 278, 147, 19, 198, 83, 262, 166, 51, 230, 115, 294, 11, 190, 75, 254, 139, 43, 222, 107, 286, 158, 27, 206, 91, 270, 174, 59, 238, 123, 302, 7, 186, 71, 250, 135, 39, 218, 103, 282, 151, 23, 202, 87, 266, 170, 55, 234, 119, 298, 15, 194, 79, 258, 143, 47, 226, 111, 290, 162, 31, 210, 95, 274, 178, 63, 242, 127, 306]; - - return (unsafe{*PERM307.get_unchecked((index % 307) as usize)} as u32 * 94249 + - unsafe{*PERM307.get_unchecked(((index / 307) % 307) as usize)} as u32 * 307 + - unsafe{*PERM307.get_unchecked(((index / 94249) % 307) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (28934443u32 as f32)); // Results in [0,1). -} - - -fn halton311(index: u32) -> f32 { - const PERM311: [u16; 311] = [0, 183, 64, 247, 128, 32, 215, 96, 279, 144, 16, 199, 80, 263, 167, 48, 231, 112, 295, 8, 191, 72, 255, 136, 40, 223, 104, 287, 159, 24, 207, 88, 271, 175, 56, 239, 120, 303, 152, 4, 187, 68, 251, 132, 36, 219, 100, 283, 148, 20, 203, 84, 267, 171, 52, 235, 116, 299, 12, 195, 76, 259, 140, 44, 227, 108, 291, 163, 28, 211, 92, 275, 179, 60, 243, 124, 307, 154, 2, 185, 66, 249, 130, 34, 217, 98, 281, 146, 18, 201, 82, 265, 169, 50, 233, 114, 297, 10, 193, 74, 257, 138, 42, 225, 106, 289, 161, 26, 209, 90, 273, 177, 58, 241, 122, 305, 157, 6, 189, 70, 253, 134, 38, 221, 102, 285, 150, 22, 205, 86, 269, 173, 54, 237, 118, 301, 14, 197, 78, 261, 142, 46, 229, 110, 293, 165, 30, 213, 94, 277, 181, 62, 245, 126, 309, 155, 1, 184, 65, 248, 129, 33, 216, 97, 280, 145, 17, 200, 81, 264, 168, 49, 232, 113, 296, 9, 192, 73, 256, 137, 41, 224, 105, 288, 160, 25, 208, 89, 272, 176, 57, 240, 121, 304, 153, 5, 188, 69, 252, 133, 37, 220, 101, 284, 149, 21, 204, 85, 268, 172, 53, 236, 117, 300, 13, 196, 77, 260, 141, 45, 228, 109, 292, 164, 29, 212, 93, 276, 180, 61, 244, 125, 308, 156, 3, 186, 67, 250, 131, 35, 218, 99, 282, 147, 19, 202, 83, 266, 170, 51, 234, 115, 298, 11, 194, 75, 258, 139, 43, 226, 107, 290, 162, 27, 210, 91, 274, 178, 59, 242, 123, 306, 158, 7, 190, 71, 254, 135, 39, 222, 103, 286, 151, 23, 206, 87, 270, 174, 55, 238, 119, 302, 15, 198, 79, 262, 143, 47, 230, 111, 294, 166, 31, 214, 95, 278, 182, 63, 246, 127, 310]; - - return (unsafe{*PERM311.get_unchecked((index % 311) as usize)} as u32 * 96721 + - unsafe{*PERM311.get_unchecked(((index / 311) % 311) as usize)} as u32 * 311 + - unsafe{*PERM311.get_unchecked(((index / 96721) % 311) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (30080231u32 as f32)); // Results in [0,1). -} - - -fn halton313(index: u32) -> f32 { - const PERM313: [u16; 313] = [0, 185, 64, 249, 128, 32, 217, 96, 281, 144, 16, 201, 80, 265, 169, 48, 233, 112, 297, 152, 8, 193, 72, 257, 136, 40, 225, 104, 289, 161, 24, 209, 88, 273, 177, 56, 241, 120, 305, 4, 189, 68, 253, 132, 36, 221, 100, 285, 148, 20, 205, 84, 269, 173, 52, 237, 116, 301, 157, 12, 197, 76, 261, 140, 44, 229, 108, 293, 165, 28, 213, 92, 277, 181, 60, 245, 124, 309, 2, 187, 66, 251, 130, 34, 219, 98, 283, 146, 18, 203, 82, 267, 171, 50, 235, 114, 299, 154, 10, 195, 74, 259, 138, 42, 227, 106, 291, 163, 26, 211, 90, 275, 179, 58, 243, 122, 307, 6, 191, 70, 255, 134, 38, 223, 102, 287, 150, 22, 207, 86, 271, 175, 54, 239, 118, 303, 159, 14, 199, 78, 263, 142, 46, 231, 110, 295, 167, 30, 215, 94, 279, 183, 62, 247, 126, 311, 156, 1, 186, 65, 250, 129, 33, 218, 97, 282, 145, 17, 202, 81, 266, 170, 49, 234, 113, 298, 153, 9, 194, 73, 258, 137, 41, 226, 105, 290, 162, 25, 210, 89, 274, 178, 57, 242, 121, 306, 5, 190, 69, 254, 133, 37, 222, 101, 286, 149, 21, 206, 85, 270, 174, 53, 238, 117, 302, 158, 13, 198, 77, 262, 141, 45, 230, 109, 294, 166, 29, 214, 93, 278, 182, 61, 246, 125, 310, 3, 188, 67, 252, 131, 35, 220, 99, 284, 147, 19, 204, 83, 268, 172, 51, 236, 115, 300, 155, 11, 196, 75, 260, 139, 43, 228, 107, 292, 164, 27, 212, 91, 276, 180, 59, 244, 123, 308, 7, 192, 71, 256, 135, 39, 224, 103, 288, 151, 23, 208, 87, 272, 176, 55, 240, 119, 304, 160, 15, 200, 79, 264, 143, 47, 232, 111, 296, 168, 31, 216, 95, 280, 184, 63, 248, 127, 312]; - - return (unsafe{*PERM313.get_unchecked((index % 313) as usize)} as u32 * 97969 + - unsafe{*PERM313.get_unchecked(((index / 313) % 313) as usize)} as u32 * 313 + - unsafe{*PERM313.get_unchecked(((index / 97969) % 313) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (30664297u32 as f32)); // Results in [0,1). -} - - -fn halton317(index: u32) -> f32 { - const PERM317: [u16; 317] = [0, 189, 64, 253, 128, 32, 221, 96, 285, 144, 16, 205, 80, 269, 173, 48, 237, 112, 301, 152, 8, 197, 72, 261, 136, 40, 229, 104, 293, 165, 24, 213, 88, 277, 181, 56, 245, 120, 309, 156, 4, 193, 68, 257, 132, 36, 225, 100, 289, 148, 20, 209, 84, 273, 177, 52, 241, 116, 305, 161, 12, 201, 76, 265, 140, 44, 233, 108, 297, 169, 28, 217, 92, 281, 185, 60, 249, 124, 313, 2, 191, 66, 255, 130, 34, 223, 98, 287, 146, 18, 207, 82, 271, 175, 50, 239, 114, 303, 154, 10, 199, 74, 263, 138, 42, 231, 106, 295, 167, 26, 215, 90, 279, 183, 58, 247, 122, 311, 159, 6, 195, 70, 259, 134, 38, 227, 102, 291, 150, 22, 211, 86, 275, 179, 54, 243, 118, 307, 163, 14, 203, 78, 267, 142, 46, 235, 110, 299, 171, 30, 219, 94, 283, 187, 62, 251, 126, 315, 158, 1, 190, 65, 254, 129, 33, 222, 97, 286, 145, 17, 206, 81, 270, 174, 49, 238, 113, 302, 153, 9, 198, 73, 262, 137, 41, 230, 105, 294, 166, 25, 214, 89, 278, 182, 57, 246, 121, 310, 157, 5, 194, 69, 258, 133, 37, 226, 101, 290, 149, 21, 210, 85, 274, 178, 53, 242, 117, 306, 162, 13, 202, 77, 266, 141, 45, 234, 109, 298, 170, 29, 218, 93, 282, 186, 61, 250, 125, 314, 3, 192, 67, 256, 131, 35, 224, 99, 288, 147, 19, 208, 83, 272, 176, 51, 240, 115, 304, 155, 11, 200, 75, 264, 139, 43, 232, 107, 296, 168, 27, 216, 91, 280, 184, 59, 248, 123, 312, 160, 7, 196, 71, 260, 135, 39, 228, 103, 292, 151, 23, 212, 87, 276, 180, 55, 244, 119, 308, 164, 15, 204, 79, 268, 143, 47, 236, 111, 300, 172, 31, 220, 95, 284, 188, 63, 252, 127, 316]; - - return (unsafe{*PERM317.get_unchecked((index % 317) as usize)} as u32 * 100489 + - unsafe{*PERM317.get_unchecked(((index / 317) % 317) as usize)} as u32 * 317 + - unsafe{*PERM317.get_unchecked(((index / 100489) % 317) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (31855013u32 as f32)); // Results in [0,1). -} - - -fn halton331(index: u32) -> f32 { - const PERM331: [u16; 331] = [0, 203, 128, 64, 267, 32, 235, 171, 96, 299, 16, 219, 144, 80, 283, 48, 251, 187, 112, 315, 160, 8, 211, 136, 72, 275, 40, 243, 179, 104, 307, 24, 227, 152, 88, 291, 56, 259, 195, 120, 323, 4, 207, 132, 68, 271, 36, 239, 175, 100, 303, 20, 223, 148, 84, 287, 52, 255, 191, 116, 319, 167, 12, 215, 140, 76, 279, 44, 247, 183, 108, 311, 28, 231, 156, 92, 295, 60, 263, 199, 124, 327, 164, 2, 205, 130, 66, 269, 34, 237, 173, 98, 301, 18, 221, 146, 82, 285, 50, 253, 189, 114, 317, 162, 10, 213, 138, 74, 277, 42, 245, 181, 106, 309, 26, 229, 154, 90, 293, 58, 261, 197, 122, 325, 6, 209, 134, 70, 273, 38, 241, 177, 102, 305, 22, 225, 150, 86, 289, 54, 257, 193, 118, 321, 169, 14, 217, 142, 78, 281, 46, 249, 185, 110, 313, 30, 233, 158, 94, 297, 62, 265, 201, 126, 329, 165, 1, 204, 129, 65, 268, 33, 236, 172, 97, 300, 17, 220, 145, 81, 284, 49, 252, 188, 113, 316, 161, 9, 212, 137, 73, 276, 41, 244, 180, 105, 308, 25, 228, 153, 89, 292, 57, 260, 196, 121, 324, 5, 208, 133, 69, 272, 37, 240, 176, 101, 304, 21, 224, 149, 85, 288, 53, 256, 192, 117, 320, 168, 13, 216, 141, 77, 280, 45, 248, 184, 109, 312, 29, 232, 157, 93, 296, 61, 264, 200, 125, 328, 166, 3, 206, 131, 67, 270, 35, 238, 174, 99, 302, 19, 222, 147, 83, 286, 51, 254, 190, 115, 318, 163, 11, 214, 139, 75, 278, 43, 246, 182, 107, 310, 27, 230, 155, 91, 294, 59, 262, 198, 123, 326, 7, 210, 135, 71, 274, 39, 242, 178, 103, 306, 23, 226, 151, 87, 290, 55, 258, 194, 119, 322, 170, 15, 218, 143, 79, 282, 47, 250, 186, 111, 314, 31, 234, 159, 95, 298, 63, 266, 202, 127, 330]; - - return (unsafe{*PERM331.get_unchecked((index % 331) as usize)} as u32 * 109561 + - unsafe{*PERM331.get_unchecked(((index / 331) % 331) as usize)} as u32 * 331 + - unsafe{*PERM331.get_unchecked(((index / 109561) % 331) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (36264691u32 as f32)); // Results in [0,1). -} - - -fn halton337(index: u32) -> f32 { - const PERM337: [u16; 337] = [0, 209, 128, 64, 273, 32, 241, 177, 96, 305, 160, 16, 225, 144, 80, 289, 48, 257, 193, 112, 321, 8, 217, 136, 72, 281, 40, 249, 185, 104, 313, 169, 24, 233, 152, 88, 297, 56, 265, 201, 120, 329, 4, 213, 132, 68, 277, 36, 245, 181, 100, 309, 164, 20, 229, 148, 84, 293, 52, 261, 197, 116, 325, 12, 221, 140, 76, 285, 44, 253, 189, 108, 317, 173, 28, 237, 156, 92, 301, 60, 269, 205, 124, 333, 2, 211, 130, 66, 275, 34, 243, 179, 98, 307, 162, 18, 227, 146, 82, 291, 50, 259, 195, 114, 323, 10, 219, 138, 74, 283, 42, 251, 187, 106, 315, 171, 26, 235, 154, 90, 299, 58, 267, 203, 122, 331, 6, 215, 134, 70, 279, 38, 247, 183, 102, 311, 166, 22, 231, 150, 86, 295, 54, 263, 199, 118, 327, 14, 223, 142, 78, 287, 46, 255, 191, 110, 319, 175, 30, 239, 158, 94, 303, 62, 271, 207, 126, 335, 168, 1, 210, 129, 65, 274, 33, 242, 178, 97, 306, 161, 17, 226, 145, 81, 290, 49, 258, 194, 113, 322, 9, 218, 137, 73, 282, 41, 250, 186, 105, 314, 170, 25, 234, 153, 89, 298, 57, 266, 202, 121, 330, 5, 214, 133, 69, 278, 37, 246, 182, 101, 310, 165, 21, 230, 149, 85, 294, 53, 262, 198, 117, 326, 13, 222, 141, 77, 286, 45, 254, 190, 109, 318, 174, 29, 238, 157, 93, 302, 61, 270, 206, 125, 334, 3, 212, 131, 67, 276, 35, 244, 180, 99, 308, 163, 19, 228, 147, 83, 292, 51, 260, 196, 115, 324, 11, 220, 139, 75, 284, 43, 252, 188, 107, 316, 172, 27, 236, 155, 91, 300, 59, 268, 204, 123, 332, 7, 216, 135, 71, 280, 39, 248, 184, 103, 312, 167, 23, 232, 151, 87, 296, 55, 264, 200, 119, 328, 15, 224, 143, 79, 288, 47, 256, 192, 111, 320, 176, 31, 240, 159, 95, 304, 63, 272, 208, 127, 336]; - - return (unsafe{*PERM337.get_unchecked((index % 337) as usize)} as u32 * 113569 + - unsafe{*PERM337.get_unchecked(((index / 337) % 337) as usize)} as u32 * 337 + - unsafe{*PERM337.get_unchecked(((index / 113569) % 337) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (38272753u32 as f32)); // Results in [0,1). -} - - -fn halton347(index: u32) -> f32 { - const PERM347: [u16; 347] = [0, 219, 128, 64, 283, 32, 251, 187, 96, 315, 160, 16, 235, 144, 80, 299, 48, 267, 203, 112, 331, 168, 8, 227, 136, 72, 291, 40, 259, 195, 104, 323, 179, 24, 243, 152, 88, 307, 56, 275, 211, 120, 339, 4, 223, 132, 68, 287, 36, 255, 191, 100, 319, 164, 20, 239, 148, 84, 303, 52, 271, 207, 116, 335, 175, 12, 231, 140, 76, 295, 44, 263, 199, 108, 327, 183, 28, 247, 156, 92, 311, 60, 279, 215, 124, 343, 172, 2, 221, 130, 66, 285, 34, 253, 189, 98, 317, 162, 18, 237, 146, 82, 301, 50, 269, 205, 114, 333, 170, 10, 229, 138, 74, 293, 42, 261, 197, 106, 325, 181, 26, 245, 154, 90, 309, 58, 277, 213, 122, 341, 6, 225, 134, 70, 289, 38, 257, 193, 102, 321, 166, 22, 241, 150, 86, 305, 54, 273, 209, 118, 337, 177, 14, 233, 142, 78, 297, 46, 265, 201, 110, 329, 185, 30, 249, 158, 94, 313, 62, 281, 217, 126, 345, 173, 1, 220, 129, 65, 284, 33, 252, 188, 97, 316, 161, 17, 236, 145, 81, 300, 49, 268, 204, 113, 332, 169, 9, 228, 137, 73, 292, 41, 260, 196, 105, 324, 180, 25, 244, 153, 89, 308, 57, 276, 212, 121, 340, 5, 224, 133, 69, 288, 37, 256, 192, 101, 320, 165, 21, 240, 149, 85, 304, 53, 272, 208, 117, 336, 176, 13, 232, 141, 77, 296, 45, 264, 200, 109, 328, 184, 29, 248, 157, 93, 312, 61, 280, 216, 125, 344, 174, 3, 222, 131, 67, 286, 35, 254, 190, 99, 318, 163, 19, 238, 147, 83, 302, 51, 270, 206, 115, 334, 171, 11, 230, 139, 75, 294, 43, 262, 198, 107, 326, 182, 27, 246, 155, 91, 310, 59, 278, 214, 123, 342, 7, 226, 135, 71, 290, 39, 258, 194, 103, 322, 167, 23, 242, 151, 87, 306, 55, 274, 210, 119, 338, 178, 15, 234, 143, 79, 298, 47, 266, 202, 111, 330, 186, 31, 250, 159, 95, 314, 63, 282, 218, 127, 346]; - - return (unsafe{*PERM347.get_unchecked((index % 347) as usize)} as u32 * 120409 + - unsafe{*PERM347.get_unchecked(((index / 347) % 347) as usize)} as u32 * 347 + - unsafe{*PERM347.get_unchecked(((index / 120409) % 347) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (41781923u32 as f32)); // Results in [0,1). -} - - -fn halton349(index: u32) -> f32 { - const PERM349: [u16; 349] = [0, 221, 128, 64, 285, 32, 253, 189, 96, 317, 160, 16, 237, 144, 80, 301, 48, 269, 205, 112, 333, 168, 8, 229, 136, 72, 293, 40, 261, 197, 104, 325, 181, 24, 245, 152, 88, 309, 56, 277, 213, 120, 341, 172, 4, 225, 132, 68, 289, 36, 257, 193, 100, 321, 164, 20, 241, 148, 84, 305, 52, 273, 209, 116, 337, 177, 12, 233, 140, 76, 297, 44, 265, 201, 108, 329, 185, 28, 249, 156, 92, 313, 60, 281, 217, 124, 345, 2, 223, 130, 66, 287, 34, 255, 191, 98, 319, 162, 18, 239, 146, 82, 303, 50, 271, 207, 114, 335, 170, 10, 231, 138, 74, 295, 42, 263, 199, 106, 327, 183, 26, 247, 154, 90, 311, 58, 279, 215, 122, 343, 175, 6, 227, 134, 70, 291, 38, 259, 195, 102, 323, 166, 22, 243, 150, 86, 307, 54, 275, 211, 118, 339, 179, 14, 235, 142, 78, 299, 46, 267, 203, 110, 331, 187, 30, 251, 158, 94, 315, 62, 283, 219, 126, 347, 174, 1, 222, 129, 65, 286, 33, 254, 190, 97, 318, 161, 17, 238, 145, 81, 302, 49, 270, 206, 113, 334, 169, 9, 230, 137, 73, 294, 41, 262, 198, 105, 326, 182, 25, 246, 153, 89, 310, 57, 278, 214, 121, 342, 173, 5, 226, 133, 69, 290, 37, 258, 194, 101, 322, 165, 21, 242, 149, 85, 306, 53, 274, 210, 117, 338, 178, 13, 234, 141, 77, 298, 45, 266, 202, 109, 330, 186, 29, 250, 157, 93, 314, 61, 282, 218, 125, 346, 3, 224, 131, 67, 288, 35, 256, 192, 99, 320, 163, 19, 240, 147, 83, 304, 51, 272, 208, 115, 336, 171, 11, 232, 139, 75, 296, 43, 264, 200, 107, 328, 184, 27, 248, 155, 91, 312, 59, 280, 216, 123, 344, 176, 7, 228, 135, 71, 292, 39, 260, 196, 103, 324, 167, 23, 244, 151, 87, 308, 55, 276, 212, 119, 340, 180, 15, 236, 143, 79, 300, 47, 268, 204, 111, 332, 188, 31, 252, 159, 95, 316, 63, 284, 220, 127, 348]; - - return (unsafe{*PERM349.get_unchecked((index % 349) as usize)} as u32 * 121801 + - unsafe{*PERM349.get_unchecked(((index / 349) % 349) as usize)} as u32 * 349 + - unsafe{*PERM349.get_unchecked(((index / 121801) % 349) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (42508549u32 as f32)); // Results in [0,1). -} - - -fn halton353(index: u32) -> f32 { - const PERM353: [u16; 353] = [0, 225, 128, 64, 289, 160, 32, 257, 193, 96, 321, 16, 241, 144, 80, 305, 177, 48, 273, 209, 112, 337, 8, 233, 136, 72, 297, 168, 40, 265, 201, 104, 329, 24, 249, 152, 88, 313, 185, 56, 281, 217, 120, 345, 4, 229, 132, 68, 293, 164, 36, 261, 197, 100, 325, 20, 245, 148, 84, 309, 181, 52, 277, 213, 116, 341, 12, 237, 140, 76, 301, 172, 44, 269, 205, 108, 333, 28, 253, 156, 92, 317, 189, 60, 285, 221, 124, 349, 2, 227, 130, 66, 291, 162, 34, 259, 195, 98, 323, 18, 243, 146, 82, 307, 179, 50, 275, 211, 114, 339, 10, 235, 138, 74, 299, 170, 42, 267, 203, 106, 331, 26, 251, 154, 90, 315, 187, 58, 283, 219, 122, 347, 6, 231, 134, 70, 295, 166, 38, 263, 199, 102, 327, 22, 247, 150, 86, 311, 183, 54, 279, 215, 118, 343, 14, 239, 142, 78, 303, 174, 46, 271, 207, 110, 335, 30, 255, 158, 94, 319, 191, 62, 287, 223, 126, 351, 176, 1, 226, 129, 65, 290, 161, 33, 258, 194, 97, 322, 17, 242, 145, 81, 306, 178, 49, 274, 210, 113, 338, 9, 234, 137, 73, 298, 169, 41, 266, 202, 105, 330, 25, 250, 153, 89, 314, 186, 57, 282, 218, 121, 346, 5, 230, 133, 69, 294, 165, 37, 262, 198, 101, 326, 21, 246, 149, 85, 310, 182, 53, 278, 214, 117, 342, 13, 238, 141, 77, 302, 173, 45, 270, 206, 109, 334, 29, 254, 157, 93, 318, 190, 61, 286, 222, 125, 350, 3, 228, 131, 67, 292, 163, 35, 260, 196, 99, 324, 19, 244, 147, 83, 308, 180, 51, 276, 212, 115, 340, 11, 236, 139, 75, 300, 171, 43, 268, 204, 107, 332, 27, 252, 155, 91, 316, 188, 59, 284, 220, 123, 348, 7, 232, 135, 71, 296, 167, 39, 264, 200, 103, 328, 23, 248, 151, 87, 312, 184, 55, 280, 216, 119, 344, 15, 240, 143, 79, 304, 175, 47, 272, 208, 111, 336, 31, 256, 159, 95, 320, 192, 63, 288, 224, 127, 352]; - - return (unsafe{*PERM353.get_unchecked((index % 353) as usize)} as u32 * 124609 + - unsafe{*PERM353.get_unchecked(((index / 353) % 353) as usize)} as u32 * 353 + - unsafe{*PERM353.get_unchecked(((index / 124609) % 353) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (43986977u32 as f32)); // Results in [0,1). -} - - -fn halton359(index: u32) -> f32 { - const PERM359: [u16; 359] = [0, 231, 128, 64, 295, 160, 32, 263, 199, 96, 327, 16, 247, 144, 80, 311, 183, 48, 279, 215, 112, 343, 8, 239, 136, 72, 303, 168, 40, 271, 207, 104, 335, 24, 255, 152, 88, 319, 191, 56, 287, 223, 120, 351, 176, 4, 235, 132, 68, 299, 164, 36, 267, 203, 100, 331, 20, 251, 148, 84, 315, 187, 52, 283, 219, 116, 347, 12, 243, 140, 76, 307, 172, 44, 275, 211, 108, 339, 28, 259, 156, 92, 323, 195, 60, 291, 227, 124, 355, 178, 2, 233, 130, 66, 297, 162, 34, 265, 201, 98, 329, 18, 249, 146, 82, 313, 185, 50, 281, 217, 114, 345, 10, 241, 138, 74, 305, 170, 42, 273, 209, 106, 337, 26, 257, 154, 90, 321, 193, 58, 289, 225, 122, 353, 181, 6, 237, 134, 70, 301, 166, 38, 269, 205, 102, 333, 22, 253, 150, 86, 317, 189, 54, 285, 221, 118, 349, 14, 245, 142, 78, 309, 174, 46, 277, 213, 110, 341, 30, 261, 158, 94, 325, 197, 62, 293, 229, 126, 357, 179, 1, 232, 129, 65, 296, 161, 33, 264, 200, 97, 328, 17, 248, 145, 81, 312, 184, 49, 280, 216, 113, 344, 9, 240, 137, 73, 304, 169, 41, 272, 208, 105, 336, 25, 256, 153, 89, 320, 192, 57, 288, 224, 121, 352, 177, 5, 236, 133, 69, 300, 165, 37, 268, 204, 101, 332, 21, 252, 149, 85, 316, 188, 53, 284, 220, 117, 348, 13, 244, 141, 77, 308, 173, 45, 276, 212, 109, 340, 29, 260, 157, 93, 324, 196, 61, 292, 228, 125, 356, 180, 3, 234, 131, 67, 298, 163, 35, 266, 202, 99, 330, 19, 250, 147, 83, 314, 186, 51, 282, 218, 115, 346, 11, 242, 139, 75, 306, 171, 43, 274, 210, 107, 338, 27, 258, 155, 91, 322, 194, 59, 290, 226, 123, 354, 182, 7, 238, 135, 71, 302, 167, 39, 270, 206, 103, 334, 23, 254, 151, 87, 318, 190, 55, 286, 222, 119, 350, 15, 246, 143, 79, 310, 175, 47, 278, 214, 111, 342, 31, 262, 159, 95, 326, 198, 63, 294, 230, 127, 358]; - - return (unsafe{*PERM359.get_unchecked((index % 359) as usize)} as u32 * 128881 + - unsafe{*PERM359.get_unchecked(((index / 359) % 359) as usize)} as u32 * 359 + - unsafe{*PERM359.get_unchecked(((index / 128881) % 359) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (46268279u32 as f32)); // Results in [0,1). -} - - -fn halton367(index: u32) -> f32 { - const PERM367: [u16; 367] = [0, 239, 128, 64, 303, 160, 32, 271, 207, 96, 335, 16, 255, 144, 80, 319, 191, 48, 287, 223, 112, 351, 176, 8, 247, 136, 72, 311, 168, 40, 279, 215, 104, 343, 24, 263, 152, 88, 327, 199, 56, 295, 231, 120, 359, 180, 4, 243, 132, 68, 307, 164, 36, 275, 211, 100, 339, 20, 259, 148, 84, 323, 195, 52, 291, 227, 116, 355, 187, 12, 251, 140, 76, 315, 172, 44, 283, 219, 108, 347, 28, 267, 156, 92, 331, 203, 60, 299, 235, 124, 363, 182, 2, 241, 130, 66, 305, 162, 34, 273, 209, 98, 337, 18, 257, 146, 82, 321, 193, 50, 289, 225, 114, 353, 178, 10, 249, 138, 74, 313, 170, 42, 281, 217, 106, 345, 26, 265, 154, 90, 329, 201, 58, 297, 233, 122, 361, 185, 6, 245, 134, 70, 309, 166, 38, 277, 213, 102, 341, 22, 261, 150, 86, 325, 197, 54, 293, 229, 118, 357, 189, 14, 253, 142, 78, 317, 174, 46, 285, 221, 110, 349, 30, 269, 158, 94, 333, 205, 62, 301, 237, 126, 365, 183, 1, 240, 129, 65, 304, 161, 33, 272, 208, 97, 336, 17, 256, 145, 81, 320, 192, 49, 288, 224, 113, 352, 177, 9, 248, 137, 73, 312, 169, 41, 280, 216, 105, 344, 25, 264, 153, 89, 328, 200, 57, 296, 232, 121, 360, 181, 5, 244, 133, 69, 308, 165, 37, 276, 212, 101, 340, 21, 260, 149, 85, 324, 196, 53, 292, 228, 117, 356, 188, 13, 252, 141, 77, 316, 173, 45, 284, 220, 109, 348, 29, 268, 157, 93, 332, 204, 61, 300, 236, 125, 364, 184, 3, 242, 131, 67, 306, 163, 35, 274, 210, 99, 338, 19, 258, 147, 83, 322, 194, 51, 290, 226, 115, 354, 179, 11, 250, 139, 75, 314, 171, 43, 282, 218, 107, 346, 27, 266, 155, 91, 330, 202, 59, 298, 234, 123, 362, 186, 7, 246, 135, 71, 310, 167, 39, 278, 214, 103, 342, 23, 262, 151, 87, 326, 198, 55, 294, 230, 119, 358, 190, 15, 254, 143, 79, 318, 175, 47, 286, 222, 111, 350, 31, 270, 159, 95, 334, 206, 63, 302, 238, 127, 366]; - - return (unsafe{*PERM367.get_unchecked((index % 367) as usize)} as u32 * 134689 + - unsafe{*PERM367.get_unchecked(((index / 367) % 367) as usize)} as u32 * 367 + - unsafe{*PERM367.get_unchecked(((index / 134689) % 367) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (49430863u32 as f32)); // Results in [0,1). -} - - -fn halton373(index: u32) -> f32 { - const PERM373: [u16; 373] = [0, 245, 128, 64, 309, 160, 32, 277, 213, 96, 341, 176, 16, 261, 144, 80, 325, 197, 48, 293, 229, 112, 357, 8, 253, 136, 72, 317, 168, 40, 285, 221, 104, 349, 189, 24, 269, 152, 88, 333, 205, 56, 301, 237, 120, 365, 184, 4, 249, 132, 68, 313, 164, 36, 281, 217, 100, 345, 180, 20, 265, 148, 84, 329, 201, 52, 297, 233, 116, 361, 12, 257, 140, 76, 321, 172, 44, 289, 225, 108, 353, 193, 28, 273, 156, 92, 337, 209, 60, 305, 241, 124, 369, 2, 247, 130, 66, 311, 162, 34, 279, 215, 98, 343, 178, 18, 263, 146, 82, 327, 199, 50, 295, 231, 114, 359, 10, 255, 138, 74, 319, 170, 42, 287, 223, 106, 351, 191, 26, 271, 154, 90, 335, 207, 58, 303, 239, 122, 367, 187, 6, 251, 134, 70, 315, 166, 38, 283, 219, 102, 347, 182, 22, 267, 150, 86, 331, 203, 54, 299, 235, 118, 363, 14, 259, 142, 78, 323, 174, 46, 291, 227, 110, 355, 195, 30, 275, 158, 94, 339, 211, 62, 307, 243, 126, 371, 186, 1, 246, 129, 65, 310, 161, 33, 278, 214, 97, 342, 177, 17, 262, 145, 81, 326, 198, 49, 294, 230, 113, 358, 9, 254, 137, 73, 318, 169, 41, 286, 222, 105, 350, 190, 25, 270, 153, 89, 334, 206, 57, 302, 238, 121, 366, 185, 5, 250, 133, 69, 314, 165, 37, 282, 218, 101, 346, 181, 21, 266, 149, 85, 330, 202, 53, 298, 234, 117, 362, 13, 258, 141, 77, 322, 173, 45, 290, 226, 109, 354, 194, 29, 274, 157, 93, 338, 210, 61, 306, 242, 125, 370, 3, 248, 131, 67, 312, 163, 35, 280, 216, 99, 344, 179, 19, 264, 147, 83, 328, 200, 51, 296, 232, 115, 360, 11, 256, 139, 75, 320, 171, 43, 288, 224, 107, 352, 192, 27, 272, 155, 91, 336, 208, 59, 304, 240, 123, 368, 188, 7, 252, 135, 71, 316, 167, 39, 284, 220, 103, 348, 183, 23, 268, 151, 87, 332, 204, 55, 300, 236, 119, 364, 15, 260, 143, 79, 324, 175, 47, 292, 228, 111, 356, 196, 31, 276, 159, 95, 340, 212, 63, 308, 244, 127, 372]; - - return (unsafe{*PERM373.get_unchecked((index % 373) as usize)} as u32 * 139129 + - unsafe{*PERM373.get_unchecked(((index / 373) % 373) as usize)} as u32 * 373 + - unsafe{*PERM373.get_unchecked(((index / 139129) % 373) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (51895117u32 as f32)); // Results in [0,1). -} - - -fn halton379(index: u32) -> f32 { - const PERM379: [u16; 379] = [0, 251, 128, 64, 315, 160, 32, 283, 219, 96, 347, 176, 16, 267, 144, 80, 331, 203, 48, 299, 235, 112, 363, 184, 8, 259, 136, 72, 323, 168, 40, 291, 227, 104, 355, 195, 24, 275, 152, 88, 339, 211, 56, 307, 243, 120, 371, 4, 255, 132, 68, 319, 164, 36, 287, 223, 100, 351, 180, 20, 271, 148, 84, 335, 207, 52, 303, 239, 116, 367, 191, 12, 263, 140, 76, 327, 172, 44, 295, 231, 108, 359, 199, 28, 279, 156, 92, 343, 215, 60, 311, 247, 124, 375, 188, 2, 253, 130, 66, 317, 162, 34, 285, 221, 98, 349, 178, 18, 269, 146, 82, 333, 205, 50, 301, 237, 114, 365, 186, 10, 261, 138, 74, 325, 170, 42, 293, 229, 106, 357, 197, 26, 277, 154, 90, 341, 213, 58, 309, 245, 122, 373, 6, 257, 134, 70, 321, 166, 38, 289, 225, 102, 353, 182, 22, 273, 150, 86, 337, 209, 54, 305, 241, 118, 369, 193, 14, 265, 142, 78, 329, 174, 46, 297, 233, 110, 361, 201, 30, 281, 158, 94, 345, 217, 62, 313, 249, 126, 377, 189, 1, 252, 129, 65, 316, 161, 33, 284, 220, 97, 348, 177, 17, 268, 145, 81, 332, 204, 49, 300, 236, 113, 364, 185, 9, 260, 137, 73, 324, 169, 41, 292, 228, 105, 356, 196, 25, 276, 153, 89, 340, 212, 57, 308, 244, 121, 372, 5, 256, 133, 69, 320, 165, 37, 288, 224, 101, 352, 181, 21, 272, 149, 85, 336, 208, 53, 304, 240, 117, 368, 192, 13, 264, 141, 77, 328, 173, 45, 296, 232, 109, 360, 200, 29, 280, 157, 93, 344, 216, 61, 312, 248, 125, 376, 190, 3, 254, 131, 67, 318, 163, 35, 286, 222, 99, 350, 179, 19, 270, 147, 83, 334, 206, 51, 302, 238, 115, 366, 187, 11, 262, 139, 75, 326, 171, 43, 294, 230, 107, 358, 198, 27, 278, 155, 91, 342, 214, 59, 310, 246, 123, 374, 7, 258, 135, 71, 322, 167, 39, 290, 226, 103, 354, 183, 23, 274, 151, 87, 338, 210, 55, 306, 242, 119, 370, 194, 15, 266, 143, 79, 330, 175, 47, 298, 234, 111, 362, 202, 31, 282, 159, 95, 346, 218, 63, 314, 250, 127, 378]; - - return (unsafe{*PERM379.get_unchecked((index % 379) as usize)} as u32 * 143641 + - unsafe{*PERM379.get_unchecked(((index / 379) % 379) as usize)} as u32 * 379 + - unsafe{*PERM379.get_unchecked(((index / 143641) % 379) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (54439939u32 as f32)); // Results in [0,1). -} - - -fn halton383(index: u32) -> f32 { - const PERM383: [u16; 383] = [0, 255, 128, 64, 319, 160, 32, 287, 223, 96, 351, 176, 16, 271, 144, 80, 335, 207, 48, 303, 239, 112, 367, 184, 8, 263, 136, 72, 327, 168, 40, 295, 231, 104, 359, 199, 24, 279, 152, 88, 343, 215, 56, 311, 247, 120, 375, 188, 4, 259, 132, 68, 323, 164, 36, 291, 227, 100, 355, 180, 20, 275, 148, 84, 339, 211, 52, 307, 243, 116, 371, 195, 12, 267, 140, 76, 331, 172, 44, 299, 235, 108, 363, 203, 28, 283, 156, 92, 347, 219, 60, 315, 251, 124, 379, 190, 2, 257, 130, 66, 321, 162, 34, 289, 225, 98, 353, 178, 18, 273, 146, 82, 337, 209, 50, 305, 241, 114, 369, 186, 10, 265, 138, 74, 329, 170, 42, 297, 233, 106, 361, 201, 26, 281, 154, 90, 345, 217, 58, 313, 249, 122, 377, 193, 6, 261, 134, 70, 325, 166, 38, 293, 229, 102, 357, 182, 22, 277, 150, 86, 341, 213, 54, 309, 245, 118, 373, 197, 14, 269, 142, 78, 333, 174, 46, 301, 237, 110, 365, 205, 30, 285, 158, 94, 349, 221, 62, 317, 253, 126, 381, 191, 1, 256, 129, 65, 320, 161, 33, 288, 224, 97, 352, 177, 17, 272, 145, 81, 336, 208, 49, 304, 240, 113, 368, 185, 9, 264, 137, 73, 328, 169, 41, 296, 232, 105, 360, 200, 25, 280, 153, 89, 344, 216, 57, 312, 248, 121, 376, 189, 5, 260, 133, 69, 324, 165, 37, 292, 228, 101, 356, 181, 21, 276, 149, 85, 340, 212, 53, 308, 244, 117, 372, 196, 13, 268, 141, 77, 332, 173, 45, 300, 236, 109, 364, 204, 29, 284, 157, 93, 348, 220, 61, 316, 252, 125, 380, 192, 3, 258, 131, 67, 322, 163, 35, 290, 226, 99, 354, 179, 19, 274, 147, 83, 338, 210, 51, 306, 242, 115, 370, 187, 11, 266, 139, 75, 330, 171, 43, 298, 234, 107, 362, 202, 27, 282, 155, 91, 346, 218, 59, 314, 250, 123, 378, 194, 7, 262, 135, 71, 326, 167, 39, 294, 230, 103, 358, 183, 23, 278, 151, 87, 342, 214, 55, 310, 246, 119, 374, 198, 15, 270, 143, 79, 334, 175, 47, 302, 238, 111, 366, 206, 31, 286, 159, 95, 350, 222, 63, 318, 254, 127, 382]; - - return (unsafe{*PERM383.get_unchecked((index % 383) as usize)} as u32 * 146689 + - unsafe{*PERM383.get_unchecked(((index / 383) % 383) as usize)} as u32 * 383 + - unsafe{*PERM383.get_unchecked(((index / 146689) % 383) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (56181887u32 as f32)); // Results in [0,1). -} - - -fn halton389(index: u32) -> f32 { - const PERM389: [u16; 389] = [0, 128, 261, 64, 197, 325, 32, 160, 293, 96, 229, 357, 16, 144, 277, 80, 213, 341, 48, 176, 309, 112, 245, 373, 8, 136, 269, 72, 205, 333, 40, 168, 301, 104, 237, 365, 24, 152, 285, 88, 221, 349, 56, 184, 317, 120, 253, 381, 192, 4, 132, 265, 68, 201, 329, 36, 164, 297, 100, 233, 361, 20, 148, 281, 84, 217, 345, 52, 180, 313, 116, 249, 377, 12, 140, 273, 76, 209, 337, 44, 172, 305, 108, 241, 369, 28, 156, 289, 92, 225, 353, 60, 188, 321, 124, 257, 385, 2, 130, 263, 66, 199, 327, 34, 162, 295, 98, 231, 359, 18, 146, 279, 82, 215, 343, 50, 178, 311, 114, 247, 375, 10, 138, 271, 74, 207, 335, 42, 170, 303, 106, 239, 367, 26, 154, 287, 90, 223, 351, 58, 186, 319, 122, 255, 383, 195, 6, 134, 267, 70, 203, 331, 38, 166, 299, 102, 235, 363, 22, 150, 283, 86, 219, 347, 54, 182, 315, 118, 251, 379, 14, 142, 275, 78, 211, 339, 46, 174, 307, 110, 243, 371, 30, 158, 291, 94, 227, 355, 62, 190, 323, 126, 259, 387, 194, 1, 129, 262, 65, 198, 326, 33, 161, 294, 97, 230, 358, 17, 145, 278, 81, 214, 342, 49, 177, 310, 113, 246, 374, 9, 137, 270, 73, 206, 334, 41, 169, 302, 105, 238, 366, 25, 153, 286, 89, 222, 350, 57, 185, 318, 121, 254, 382, 193, 5, 133, 266, 69, 202, 330, 37, 165, 298, 101, 234, 362, 21, 149, 282, 85, 218, 346, 53, 181, 314, 117, 250, 378, 13, 141, 274, 77, 210, 338, 45, 173, 306, 109, 242, 370, 29, 157, 290, 93, 226, 354, 61, 189, 322, 125, 258, 386, 3, 131, 264, 67, 200, 328, 35, 163, 296, 99, 232, 360, 19, 147, 280, 83, 216, 344, 51, 179, 312, 115, 248, 376, 11, 139, 272, 75, 208, 336, 43, 171, 304, 107, 240, 368, 27, 155, 288, 91, 224, 352, 59, 187, 320, 123, 256, 384, 196, 7, 135, 268, 71, 204, 332, 39, 167, 300, 103, 236, 364, 23, 151, 284, 87, 220, 348, 55, 183, 316, 119, 252, 380, 15, 143, 276, 79, 212, 340, 47, 175, 308, 111, 244, 372, 31, 159, 292, 95, 228, 356, 63, 191, 324, 127, 260, 388]; - - return (unsafe{*PERM389.get_unchecked((index % 389) as usize)} as u32 * 151321 + - unsafe{*PERM389.get_unchecked(((index / 389) % 389) as usize)} as u32 * 389 + - unsafe{*PERM389.get_unchecked(((index / 151321) % 389) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (58863869u32 as f32)); // Results in [0,1). -} - - -fn halton397(index: u32) -> f32 { - const PERM397: [u16; 397] = [0, 128, 269, 64, 205, 333, 32, 160, 301, 96, 237, 365, 16, 144, 285, 80, 221, 349, 48, 176, 317, 112, 253, 381, 192, 8, 136, 277, 72, 213, 341, 40, 168, 309, 104, 245, 373, 24, 152, 293, 88, 229, 357, 56, 184, 325, 120, 261, 389, 196, 4, 132, 273, 68, 209, 337, 36, 164, 305, 100, 241, 369, 20, 148, 289, 84, 225, 353, 52, 180, 321, 116, 257, 385, 201, 12, 140, 281, 76, 217, 345, 44, 172, 313, 108, 249, 377, 28, 156, 297, 92, 233, 361, 60, 188, 329, 124, 265, 393, 2, 130, 271, 66, 207, 335, 34, 162, 303, 98, 239, 367, 18, 146, 287, 82, 223, 351, 50, 178, 319, 114, 255, 383, 194, 10, 138, 279, 74, 215, 343, 42, 170, 311, 106, 247, 375, 26, 154, 295, 90, 231, 359, 58, 186, 327, 122, 263, 391, 199, 6, 134, 275, 70, 211, 339, 38, 166, 307, 102, 243, 371, 22, 150, 291, 86, 227, 355, 54, 182, 323, 118, 259, 387, 203, 14, 142, 283, 78, 219, 347, 46, 174, 315, 110, 251, 379, 30, 158, 299, 94, 235, 363, 62, 190, 331, 126, 267, 395, 198, 1, 129, 270, 65, 206, 334, 33, 161, 302, 97, 238, 366, 17, 145, 286, 81, 222, 350, 49, 177, 318, 113, 254, 382, 193, 9, 137, 278, 73, 214, 342, 41, 169, 310, 105, 246, 374, 25, 153, 294, 89, 230, 358, 57, 185, 326, 121, 262, 390, 197, 5, 133, 274, 69, 210, 338, 37, 165, 306, 101, 242, 370, 21, 149, 290, 85, 226, 354, 53, 181, 322, 117, 258, 386, 202, 13, 141, 282, 77, 218, 346, 45, 173, 314, 109, 250, 378, 29, 157, 298, 93, 234, 362, 61, 189, 330, 125, 266, 394, 3, 131, 272, 67, 208, 336, 35, 163, 304, 99, 240, 368, 19, 147, 288, 83, 224, 352, 51, 179, 320, 115, 256, 384, 195, 11, 139, 280, 75, 216, 344, 43, 171, 312, 107, 248, 376, 27, 155, 296, 91, 232, 360, 59, 187, 328, 123, 264, 392, 200, 7, 135, 276, 71, 212, 340, 39, 167, 308, 103, 244, 372, 23, 151, 292, 87, 228, 356, 55, 183, 324, 119, 260, 388, 204, 15, 143, 284, 79, 220, 348, 47, 175, 316, 111, 252, 380, 31, 159, 300, 95, 236, 364, 63, 191, 332, 127, 268, 396]; - - return (unsafe{*PERM397.get_unchecked((index % 397) as usize)} as u32 * 157609 + - unsafe{*PERM397.get_unchecked(((index / 397) % 397) as usize)} as u32 * 397 + - unsafe{*PERM397.get_unchecked(((index / 157609) % 397) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (62570773u32 as f32)); // Results in [0,1). -} - - -fn halton401(index: u32) -> f32 { - const PERM401: [u16; 401] = [0, 128, 273, 64, 209, 337, 32, 160, 305, 96, 241, 369, 192, 16, 144, 289, 80, 225, 353, 48, 176, 321, 112, 257, 385, 8, 136, 281, 72, 217, 345, 40, 168, 313, 104, 249, 377, 201, 24, 152, 297, 88, 233, 361, 56, 184, 329, 120, 265, 393, 4, 132, 277, 68, 213, 341, 36, 164, 309, 100, 245, 373, 196, 20, 148, 293, 84, 229, 357, 52, 180, 325, 116, 261, 389, 12, 140, 285, 76, 221, 349, 44, 172, 317, 108, 253, 381, 205, 28, 156, 301, 92, 237, 365, 60, 188, 333, 124, 269, 397, 2, 130, 275, 66, 211, 339, 34, 162, 307, 98, 243, 371, 194, 18, 146, 291, 82, 227, 355, 50, 178, 323, 114, 259, 387, 10, 138, 283, 74, 219, 347, 42, 170, 315, 106, 251, 379, 203, 26, 154, 299, 90, 235, 363, 58, 186, 331, 122, 267, 395, 6, 134, 279, 70, 215, 343, 38, 166, 311, 102, 247, 375, 198, 22, 150, 295, 86, 231, 359, 54, 182, 327, 118, 263, 391, 14, 142, 287, 78, 223, 351, 46, 174, 319, 110, 255, 383, 207, 30, 158, 303, 94, 239, 367, 62, 190, 335, 126, 271, 399, 200, 1, 129, 274, 65, 210, 338, 33, 161, 306, 97, 242, 370, 193, 17, 145, 290, 81, 226, 354, 49, 177, 322, 113, 258, 386, 9, 137, 282, 73, 218, 346, 41, 169, 314, 105, 250, 378, 202, 25, 153, 298, 89, 234, 362, 57, 185, 330, 121, 266, 394, 5, 133, 278, 69, 214, 342, 37, 165, 310, 101, 246, 374, 197, 21, 149, 294, 85, 230, 358, 53, 181, 326, 117, 262, 390, 13, 141, 286, 77, 222, 350, 45, 173, 318, 109, 254, 382, 206, 29, 157, 302, 93, 238, 366, 61, 189, 334, 125, 270, 398, 3, 131, 276, 67, 212, 340, 35, 163, 308, 99, 244, 372, 195, 19, 147, 292, 83, 228, 356, 51, 179, 324, 115, 260, 388, 11, 139, 284, 75, 220, 348, 43, 171, 316, 107, 252, 380, 204, 27, 155, 300, 91, 236, 364, 59, 187, 332, 123, 268, 396, 7, 135, 280, 71, 216, 344, 39, 167, 312, 103, 248, 376, 199, 23, 151, 296, 87, 232, 360, 55, 183, 328, 119, 264, 392, 15, 143, 288, 79, 224, 352, 47, 175, 320, 111, 256, 384, 208, 31, 159, 304, 95, 240, 368, 63, 191, 336, 127, 272, 400]; - - return (unsafe{*PERM401.get_unchecked((index % 401) as usize)} as u32 * 160801 + - unsafe{*PERM401.get_unchecked(((index / 401) % 401) as usize)} as u32 * 401 + - unsafe{*PERM401.get_unchecked(((index / 160801) % 401) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (64481201u32 as f32)); // Results in [0,1). -} - - -fn halton409(index: u32) -> f32 { - const PERM409: [u16; 409] = [0, 128, 281, 64, 217, 345, 32, 160, 313, 96, 249, 377, 192, 16, 144, 297, 80, 233, 361, 48, 176, 329, 112, 265, 393, 200, 8, 136, 289, 72, 225, 353, 40, 168, 321, 104, 257, 385, 209, 24, 152, 305, 88, 241, 369, 56, 184, 337, 120, 273, 401, 4, 132, 285, 68, 221, 349, 36, 164, 317, 100, 253, 381, 196, 20, 148, 301, 84, 237, 365, 52, 180, 333, 116, 269, 397, 205, 12, 140, 293, 76, 229, 357, 44, 172, 325, 108, 261, 389, 213, 28, 156, 309, 92, 245, 373, 60, 188, 341, 124, 277, 405, 2, 130, 283, 66, 219, 347, 34, 162, 315, 98, 251, 379, 194, 18, 146, 299, 82, 235, 363, 50, 178, 331, 114, 267, 395, 202, 10, 138, 291, 74, 227, 355, 42, 170, 323, 106, 259, 387, 211, 26, 154, 307, 90, 243, 371, 58, 186, 339, 122, 275, 403, 6, 134, 287, 70, 223, 351, 38, 166, 319, 102, 255, 383, 198, 22, 150, 303, 86, 239, 367, 54, 182, 335, 118, 271, 399, 207, 14, 142, 295, 78, 231, 359, 46, 174, 327, 110, 263, 391, 215, 30, 158, 311, 94, 247, 375, 62, 190, 343, 126, 279, 407, 204, 1, 129, 282, 65, 218, 346, 33, 161, 314, 97, 250, 378, 193, 17, 145, 298, 81, 234, 362, 49, 177, 330, 113, 266, 394, 201, 9, 137, 290, 73, 226, 354, 41, 169, 322, 105, 258, 386, 210, 25, 153, 306, 89, 242, 370, 57, 185, 338, 121, 274, 402, 5, 133, 286, 69, 222, 350, 37, 165, 318, 101, 254, 382, 197, 21, 149, 302, 85, 238, 366, 53, 181, 334, 117, 270, 398, 206, 13, 141, 294, 77, 230, 358, 45, 173, 326, 109, 262, 390, 214, 29, 157, 310, 93, 246, 374, 61, 189, 342, 125, 278, 406, 3, 131, 284, 67, 220, 348, 35, 163, 316, 99, 252, 380, 195, 19, 147, 300, 83, 236, 364, 51, 179, 332, 115, 268, 396, 203, 11, 139, 292, 75, 228, 356, 43, 171, 324, 107, 260, 388, 212, 27, 155, 308, 91, 244, 372, 59, 187, 340, 123, 276, 404, 7, 135, 288, 71, 224, 352, 39, 167, 320, 103, 256, 384, 199, 23, 151, 304, 87, 240, 368, 55, 183, 336, 119, 272, 400, 208, 15, 143, 296, 79, 232, 360, 47, 175, 328, 111, 264, 392, 216, 31, 159, 312, 95, 248, 376, 63, 191, 344, 127, 280, 408]; - - return (unsafe{*PERM409.get_unchecked((index % 409) as usize)} as u32 * 167281 + - unsafe{*PERM409.get_unchecked(((index / 409) % 409) as usize)} as u32 * 409 + - unsafe{*PERM409.get_unchecked(((index / 167281) % 409) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (68417929u32 as f32)); // Results in [0,1). -} - - -fn halton419(index: u32) -> f32 { - const PERM419: [u16; 419] = [0, 128, 291, 64, 227, 355, 192, 32, 160, 323, 96, 259, 387, 16, 144, 307, 80, 243, 371, 211, 48, 176, 339, 112, 275, 403, 8, 136, 299, 72, 235, 363, 200, 40, 168, 331, 104, 267, 395, 24, 152, 315, 88, 251, 379, 219, 56, 184, 347, 120, 283, 411, 4, 132, 295, 68, 231, 359, 196, 36, 164, 327, 100, 263, 391, 20, 148, 311, 84, 247, 375, 215, 52, 180, 343, 116, 279, 407, 12, 140, 303, 76, 239, 367, 204, 44, 172, 335, 108, 271, 399, 28, 156, 319, 92, 255, 383, 223, 60, 188, 351, 124, 287, 415, 208, 2, 130, 293, 66, 229, 357, 194, 34, 162, 325, 98, 261, 389, 18, 146, 309, 82, 245, 373, 213, 50, 178, 341, 114, 277, 405, 10, 138, 301, 74, 237, 365, 202, 42, 170, 333, 106, 269, 397, 26, 154, 317, 90, 253, 381, 221, 58, 186, 349, 122, 285, 413, 6, 134, 297, 70, 233, 361, 198, 38, 166, 329, 102, 265, 393, 22, 150, 313, 86, 249, 377, 217, 54, 182, 345, 118, 281, 409, 14, 142, 305, 78, 241, 369, 206, 46, 174, 337, 110, 273, 401, 30, 158, 321, 94, 257, 385, 225, 62, 190, 353, 126, 289, 417, 209, 1, 129, 292, 65, 228, 356, 193, 33, 161, 324, 97, 260, 388, 17, 145, 308, 81, 244, 372, 212, 49, 177, 340, 113, 276, 404, 9, 137, 300, 73, 236, 364, 201, 41, 169, 332, 105, 268, 396, 25, 153, 316, 89, 252, 380, 220, 57, 185, 348, 121, 284, 412, 5, 133, 296, 69, 232, 360, 197, 37, 165, 328, 101, 264, 392, 21, 149, 312, 85, 248, 376, 216, 53, 181, 344, 117, 280, 408, 13, 141, 304, 77, 240, 368, 205, 45, 173, 336, 109, 272, 400, 29, 157, 320, 93, 256, 384, 224, 61, 189, 352, 125, 288, 416, 210, 3, 131, 294, 67, 230, 358, 195, 35, 163, 326, 99, 262, 390, 19, 147, 310, 83, 246, 374, 214, 51, 179, 342, 115, 278, 406, 11, 139, 302, 75, 238, 366, 203, 43, 171, 334, 107, 270, 398, 27, 155, 318, 91, 254, 382, 222, 59, 187, 350, 123, 286, 414, 7, 135, 298, 71, 234, 362, 199, 39, 167, 330, 103, 266, 394, 23, 151, 314, 87, 250, 378, 218, 55, 183, 346, 119, 282, 410, 15, 143, 306, 79, 242, 370, 207, 47, 175, 338, 111, 274, 402, 31, 159, 322, 95, 258, 386, 226, 63, 191, 354, 127, 290, 418]; - - return (unsafe{*PERM419.get_unchecked((index % 419) as usize)} as u32 * 175561 + - unsafe{*PERM419.get_unchecked(((index / 419) % 419) as usize)} as u32 * 419 + - unsafe{*PERM419.get_unchecked(((index / 175561) % 419) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (73560059u32 as f32)); // Results in [0,1). -} - - -fn halton421(index: u32) -> f32 { - const PERM421: [u16; 421] = [0, 128, 293, 64, 229, 357, 192, 32, 160, 325, 96, 261, 389, 16, 144, 309, 80, 245, 373, 213, 48, 176, 341, 112, 277, 405, 8, 136, 301, 72, 237, 365, 200, 40, 168, 333, 104, 269, 397, 24, 152, 317, 88, 253, 381, 221, 56, 184, 349, 120, 285, 413, 208, 4, 132, 297, 68, 233, 361, 196, 36, 164, 329, 100, 265, 393, 20, 148, 313, 84, 249, 377, 217, 52, 180, 345, 116, 281, 409, 12, 140, 305, 76, 241, 369, 204, 44, 172, 337, 108, 273, 401, 28, 156, 321, 92, 257, 385, 225, 60, 188, 353, 124, 289, 417, 2, 130, 295, 66, 231, 359, 194, 34, 162, 327, 98, 263, 391, 18, 146, 311, 82, 247, 375, 215, 50, 178, 343, 114, 279, 407, 10, 138, 303, 74, 239, 367, 202, 42, 170, 335, 106, 271, 399, 26, 154, 319, 90, 255, 383, 223, 58, 186, 351, 122, 287, 415, 211, 6, 134, 299, 70, 235, 363, 198, 38, 166, 331, 102, 267, 395, 22, 150, 315, 86, 251, 379, 219, 54, 182, 347, 118, 283, 411, 14, 142, 307, 78, 243, 371, 206, 46, 174, 339, 110, 275, 403, 30, 158, 323, 94, 259, 387, 227, 62, 190, 355, 126, 291, 419, 210, 1, 129, 294, 65, 230, 358, 193, 33, 161, 326, 97, 262, 390, 17, 145, 310, 81, 246, 374, 214, 49, 177, 342, 113, 278, 406, 9, 137, 302, 73, 238, 366, 201, 41, 169, 334, 105, 270, 398, 25, 153, 318, 89, 254, 382, 222, 57, 185, 350, 121, 286, 414, 209, 5, 133, 298, 69, 234, 362, 197, 37, 165, 330, 101, 266, 394, 21, 149, 314, 85, 250, 378, 218, 53, 181, 346, 117, 282, 410, 13, 141, 306, 77, 242, 370, 205, 45, 173, 338, 109, 274, 402, 29, 157, 322, 93, 258, 386, 226, 61, 189, 354, 125, 290, 418, 3, 131, 296, 67, 232, 360, 195, 35, 163, 328, 99, 264, 392, 19, 147, 312, 83, 248, 376, 216, 51, 179, 344, 115, 280, 408, 11, 139, 304, 75, 240, 368, 203, 43, 171, 336, 107, 272, 400, 27, 155, 320, 91, 256, 384, 224, 59, 187, 352, 123, 288, 416, 212, 7, 135, 300, 71, 236, 364, 199, 39, 167, 332, 103, 268, 396, 23, 151, 316, 87, 252, 380, 220, 55, 183, 348, 119, 284, 412, 15, 143, 308, 79, 244, 372, 207, 47, 175, 340, 111, 276, 404, 31, 159, 324, 95, 260, 388, 228, 63, 191, 356, 127, 292, 420]; - - return (unsafe{*PERM421.get_unchecked((index % 421) as usize)} as u32 * 177241 + - unsafe{*PERM421.get_unchecked(((index / 421) % 421) as usize)} as u32 * 421 + - unsafe{*PERM421.get_unchecked(((index / 177241) % 421) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (74618461u32 as f32)); // Results in [0,1). -} - - -fn halton431(index: u32) -> f32 { - const PERM431: [u16; 431] = [0, 128, 303, 64, 239, 367, 192, 32, 160, 335, 96, 271, 399, 16, 144, 319, 80, 255, 383, 223, 48, 176, 351, 112, 287, 415, 208, 8, 136, 311, 72, 247, 375, 200, 40, 168, 343, 104, 279, 407, 24, 152, 327, 88, 263, 391, 231, 56, 184, 359, 120, 295, 423, 212, 4, 132, 307, 68, 243, 371, 196, 36, 164, 339, 100, 275, 403, 20, 148, 323, 84, 259, 387, 227, 52, 180, 355, 116, 291, 419, 219, 12, 140, 315, 76, 251, 379, 204, 44, 172, 347, 108, 283, 411, 28, 156, 331, 92, 267, 395, 235, 60, 188, 363, 124, 299, 427, 214, 2, 130, 305, 66, 241, 369, 194, 34, 162, 337, 98, 273, 401, 18, 146, 321, 82, 257, 385, 225, 50, 178, 353, 114, 289, 417, 210, 10, 138, 313, 74, 249, 377, 202, 42, 170, 345, 106, 281, 409, 26, 154, 329, 90, 265, 393, 233, 58, 186, 361, 122, 297, 425, 217, 6, 134, 309, 70, 245, 373, 198, 38, 166, 341, 102, 277, 405, 22, 150, 325, 86, 261, 389, 229, 54, 182, 357, 118, 293, 421, 221, 14, 142, 317, 78, 253, 381, 206, 46, 174, 349, 110, 285, 413, 30, 158, 333, 94, 269, 397, 237, 62, 190, 365, 126, 301, 429, 215, 1, 129, 304, 65, 240, 368, 193, 33, 161, 336, 97, 272, 400, 17, 145, 320, 81, 256, 384, 224, 49, 177, 352, 113, 288, 416, 209, 9, 137, 312, 73, 248, 376, 201, 41, 169, 344, 105, 280, 408, 25, 153, 328, 89, 264, 392, 232, 57, 185, 360, 121, 296, 424, 213, 5, 133, 308, 69, 244, 372, 197, 37, 165, 340, 101, 276, 404, 21, 149, 324, 85, 260, 388, 228, 53, 181, 356, 117, 292, 420, 220, 13, 141, 316, 77, 252, 380, 205, 45, 173, 348, 109, 284, 412, 29, 157, 332, 93, 268, 396, 236, 61, 189, 364, 125, 300, 428, 216, 3, 131, 306, 67, 242, 370, 195, 35, 163, 338, 99, 274, 402, 19, 147, 322, 83, 258, 386, 226, 51, 179, 354, 115, 290, 418, 211, 11, 139, 314, 75, 250, 378, 203, 43, 171, 346, 107, 282, 410, 27, 155, 330, 91, 266, 394, 234, 59, 187, 362, 123, 298, 426, 218, 7, 135, 310, 71, 246, 374, 199, 39, 167, 342, 103, 278, 406, 23, 151, 326, 87, 262, 390, 230, 55, 183, 358, 119, 294, 422, 222, 15, 143, 318, 79, 254, 382, 207, 47, 175, 350, 111, 286, 414, 31, 159, 334, 95, 270, 398, 238, 63, 191, 366, 127, 302, 430]; - - return (unsafe{*PERM431.get_unchecked((index % 431) as usize)} as u32 * 185761 + - unsafe{*PERM431.get_unchecked(((index / 431) % 431) as usize)} as u32 * 431 + - unsafe{*PERM431.get_unchecked(((index / 185761) % 431) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (80062991u32 as f32)); // Results in [0,1). -} - - -fn halton433(index: u32) -> f32 { - const PERM433: [u16; 433] = [0, 128, 305, 64, 241, 369, 192, 32, 160, 337, 96, 273, 401, 208, 16, 144, 321, 80, 257, 385, 225, 48, 176, 353, 112, 289, 417, 8, 136, 313, 72, 249, 377, 200, 40, 168, 345, 104, 281, 409, 217, 24, 152, 329, 88, 265, 393, 233, 56, 184, 361, 120, 297, 425, 4, 132, 309, 68, 245, 373, 196, 36, 164, 341, 100, 277, 405, 212, 20, 148, 325, 84, 261, 389, 229, 52, 180, 357, 116, 293, 421, 12, 140, 317, 76, 253, 381, 204, 44, 172, 349, 108, 285, 413, 221, 28, 156, 333, 92, 269, 397, 237, 60, 188, 365, 124, 301, 429, 2, 130, 307, 66, 243, 371, 194, 34, 162, 339, 98, 275, 403, 210, 18, 146, 323, 82, 259, 387, 227, 50, 178, 355, 114, 291, 419, 10, 138, 315, 74, 251, 379, 202, 42, 170, 347, 106, 283, 411, 219, 26, 154, 331, 90, 267, 395, 235, 58, 186, 363, 122, 299, 427, 6, 134, 311, 70, 247, 375, 198, 38, 166, 343, 102, 279, 407, 214, 22, 150, 327, 86, 263, 391, 231, 54, 182, 359, 118, 295, 423, 14, 142, 319, 78, 255, 383, 206, 46, 174, 351, 110, 287, 415, 223, 30, 158, 335, 94, 271, 399, 239, 62, 190, 367, 126, 303, 431, 216, 1, 129, 306, 65, 242, 370, 193, 33, 161, 338, 97, 274, 402, 209, 17, 145, 322, 81, 258, 386, 226, 49, 177, 354, 113, 290, 418, 9, 137, 314, 73, 250, 378, 201, 41, 169, 346, 105, 282, 410, 218, 25, 153, 330, 89, 266, 394, 234, 57, 185, 362, 121, 298, 426, 5, 133, 310, 69, 246, 374, 197, 37, 165, 342, 101, 278, 406, 213, 21, 149, 326, 85, 262, 390, 230, 53, 181, 358, 117, 294, 422, 13, 141, 318, 77, 254, 382, 205, 45, 173, 350, 109, 286, 414, 222, 29, 157, 334, 93, 270, 398, 238, 61, 189, 366, 125, 302, 430, 3, 131, 308, 67, 244, 372, 195, 35, 163, 340, 99, 276, 404, 211, 19, 147, 324, 83, 260, 388, 228, 51, 179, 356, 115, 292, 420, 11, 139, 316, 75, 252, 380, 203, 43, 171, 348, 107, 284, 412, 220, 27, 155, 332, 91, 268, 396, 236, 59, 187, 364, 123, 300, 428, 7, 135, 312, 71, 248, 376, 199, 39, 167, 344, 103, 280, 408, 215, 23, 151, 328, 87, 264, 392, 232, 55, 183, 360, 119, 296, 424, 15, 143, 320, 79, 256, 384, 207, 47, 175, 352, 111, 288, 416, 224, 31, 159, 336, 95, 272, 400, 240, 63, 191, 368, 127, 304, 432]; - - return (unsafe{*PERM433.get_unchecked((index % 433) as usize)} as u32 * 187489 + - unsafe{*PERM433.get_unchecked(((index / 433) % 433) as usize)} as u32 * 433 + - unsafe{*PERM433.get_unchecked(((index / 187489) % 433) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (81182737u32 as f32)); // Results in [0,1). -} - - -fn halton439(index: u32) -> f32 { - const PERM439: [u16; 439] = [0, 128, 311, 64, 247, 375, 192, 32, 160, 343, 96, 279, 407, 208, 16, 144, 327, 80, 263, 391, 231, 48, 176, 359, 112, 295, 423, 8, 136, 319, 72, 255, 383, 200, 40, 168, 351, 104, 287, 415, 223, 24, 152, 335, 88, 271, 399, 239, 56, 184, 367, 120, 303, 431, 216, 4, 132, 315, 68, 251, 379, 196, 36, 164, 347, 100, 283, 411, 212, 20, 148, 331, 84, 267, 395, 235, 52, 180, 363, 116, 299, 427, 12, 140, 323, 76, 259, 387, 204, 44, 172, 355, 108, 291, 419, 227, 28, 156, 339, 92, 275, 403, 243, 60, 188, 371, 124, 307, 435, 218, 2, 130, 313, 66, 249, 377, 194, 34, 162, 345, 98, 281, 409, 210, 18, 146, 329, 82, 265, 393, 233, 50, 178, 361, 114, 297, 425, 10, 138, 321, 74, 257, 385, 202, 42, 170, 353, 106, 289, 417, 225, 26, 154, 337, 90, 273, 401, 241, 58, 186, 369, 122, 305, 433, 221, 6, 134, 317, 70, 253, 381, 198, 38, 166, 349, 102, 285, 413, 214, 22, 150, 333, 86, 269, 397, 237, 54, 182, 365, 118, 301, 429, 14, 142, 325, 78, 261, 389, 206, 46, 174, 357, 110, 293, 421, 229, 30, 158, 341, 94, 277, 405, 245, 62, 190, 373, 126, 309, 437, 219, 1, 129, 312, 65, 248, 376, 193, 33, 161, 344, 97, 280, 408, 209, 17, 145, 328, 81, 264, 392, 232, 49, 177, 360, 113, 296, 424, 9, 137, 320, 73, 256, 384, 201, 41, 169, 352, 105, 288, 416, 224, 25, 153, 336, 89, 272, 400, 240, 57, 185, 368, 121, 304, 432, 217, 5, 133, 316, 69, 252, 380, 197, 37, 165, 348, 101, 284, 412, 213, 21, 149, 332, 85, 268, 396, 236, 53, 181, 364, 117, 300, 428, 13, 141, 324, 77, 260, 388, 205, 45, 173, 356, 109, 292, 420, 228, 29, 157, 340, 93, 276, 404, 244, 61, 189, 372, 125, 308, 436, 220, 3, 131, 314, 67, 250, 378, 195, 35, 163, 346, 99, 282, 410, 211, 19, 147, 330, 83, 266, 394, 234, 51, 179, 362, 115, 298, 426, 11, 139, 322, 75, 258, 386, 203, 43, 171, 354, 107, 290, 418, 226, 27, 155, 338, 91, 274, 402, 242, 59, 187, 370, 123, 306, 434, 222, 7, 135, 318, 71, 254, 382, 199, 39, 167, 350, 103, 286, 414, 215, 23, 151, 334, 87, 270, 398, 238, 55, 183, 366, 119, 302, 430, 15, 143, 326, 79, 262, 390, 207, 47, 175, 358, 111, 294, 422, 230, 31, 159, 342, 95, 278, 406, 246, 63, 191, 374, 127, 310, 438]; - - return (unsafe{*PERM439.get_unchecked((index % 439) as usize)} as u32 * 192721 + - unsafe{*PERM439.get_unchecked(((index / 439) % 439) as usize)} as u32 * 439 + - unsafe{*PERM439.get_unchecked(((index / 192721) % 439) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (84604519u32 as f32)); // Results in [0,1). -} - - -fn halton443(index: u32) -> f32 { - const PERM443: [u16; 443] = [0, 128, 315, 64, 251, 379, 192, 32, 160, 347, 96, 283, 411, 208, 16, 144, 331, 80, 267, 395, 235, 48, 176, 363, 112, 299, 427, 216, 8, 136, 323, 72, 259, 387, 200, 40, 168, 355, 104, 291, 419, 227, 24, 152, 339, 88, 275, 403, 243, 56, 184, 371, 120, 307, 435, 4, 132, 319, 68, 255, 383, 196, 36, 164, 351, 100, 287, 415, 212, 20, 148, 335, 84, 271, 399, 239, 52, 180, 367, 116, 303, 431, 223, 12, 140, 327, 76, 263, 391, 204, 44, 172, 359, 108, 295, 423, 231, 28, 156, 343, 92, 279, 407, 247, 60, 188, 375, 124, 311, 439, 220, 2, 130, 317, 66, 253, 381, 194, 34, 162, 349, 98, 285, 413, 210, 18, 146, 333, 82, 269, 397, 237, 50, 178, 365, 114, 301, 429, 218, 10, 138, 325, 74, 261, 389, 202, 42, 170, 357, 106, 293, 421, 229, 26, 154, 341, 90, 277, 405, 245, 58, 186, 373, 122, 309, 437, 6, 134, 321, 70, 257, 385, 198, 38, 166, 353, 102, 289, 417, 214, 22, 150, 337, 86, 273, 401, 241, 54, 182, 369, 118, 305, 433, 225, 14, 142, 329, 78, 265, 393, 206, 46, 174, 361, 110, 297, 425, 233, 30, 158, 345, 94, 281, 409, 249, 62, 190, 377, 126, 313, 441, 221, 1, 129, 316, 65, 252, 380, 193, 33, 161, 348, 97, 284, 412, 209, 17, 145, 332, 81, 268, 396, 236, 49, 177, 364, 113, 300, 428, 217, 9, 137, 324, 73, 260, 388, 201, 41, 169, 356, 105, 292, 420, 228, 25, 153, 340, 89, 276, 404, 244, 57, 185, 372, 121, 308, 436, 5, 133, 320, 69, 256, 384, 197, 37, 165, 352, 101, 288, 416, 213, 21, 149, 336, 85, 272, 400, 240, 53, 181, 368, 117, 304, 432, 224, 13, 141, 328, 77, 264, 392, 205, 45, 173, 360, 109, 296, 424, 232, 29, 157, 344, 93, 280, 408, 248, 61, 189, 376, 125, 312, 440, 222, 3, 131, 318, 67, 254, 382, 195, 35, 163, 350, 99, 286, 414, 211, 19, 147, 334, 83, 270, 398, 238, 51, 179, 366, 115, 302, 430, 219, 11, 139, 326, 75, 262, 390, 203, 43, 171, 358, 107, 294, 422, 230, 27, 155, 342, 91, 278, 406, 246, 59, 187, 374, 123, 310, 438, 7, 135, 322, 71, 258, 386, 199, 39, 167, 354, 103, 290, 418, 215, 23, 151, 338, 87, 274, 402, 242, 55, 183, 370, 119, 306, 434, 226, 15, 143, 330, 79, 266, 394, 207, 47, 175, 362, 111, 298, 426, 234, 31, 159, 346, 95, 282, 410, 250, 63, 191, 378, 127, 314, 442]; - - return (unsafe{*PERM443.get_unchecked((index % 443) as usize)} as u32 * 196249 + - unsafe{*PERM443.get_unchecked(((index / 443) % 443) as usize)} as u32 * 443 + - unsafe{*PERM443.get_unchecked(((index / 196249) % 443) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (86938307u32 as f32)); // Results in [0,1). -} - - -fn halton449(index: u32) -> f32 { - const PERM449: [u16; 449] = [0, 128, 321, 192, 64, 257, 385, 32, 160, 353, 225, 96, 289, 417, 16, 144, 337, 208, 80, 273, 401, 48, 176, 369, 241, 112, 305, 433, 8, 136, 329, 200, 72, 265, 393, 40, 168, 361, 233, 104, 297, 425, 24, 152, 345, 216, 88, 281, 409, 56, 184, 377, 249, 120, 313, 441, 4, 132, 325, 196, 68, 261, 389, 36, 164, 357, 229, 100, 293, 421, 20, 148, 341, 212, 84, 277, 405, 52, 180, 373, 245, 116, 309, 437, 12, 140, 333, 204, 76, 269, 397, 44, 172, 365, 237, 108, 301, 429, 28, 156, 349, 220, 92, 285, 413, 60, 188, 381, 253, 124, 317, 445, 2, 130, 323, 194, 66, 259, 387, 34, 162, 355, 227, 98, 291, 419, 18, 146, 339, 210, 82, 275, 403, 50, 178, 371, 243, 114, 307, 435, 10, 138, 331, 202, 74, 267, 395, 42, 170, 363, 235, 106, 299, 427, 26, 154, 347, 218, 90, 283, 411, 58, 186, 379, 251, 122, 315, 443, 6, 134, 327, 198, 70, 263, 391, 38, 166, 359, 231, 102, 295, 423, 22, 150, 343, 214, 86, 279, 407, 54, 182, 375, 247, 118, 311, 439, 14, 142, 335, 206, 78, 271, 399, 46, 174, 367, 239, 110, 303, 431, 30, 158, 351, 222, 94, 287, 415, 62, 190, 383, 255, 126, 319, 447, 224, 1, 129, 322, 193, 65, 258, 386, 33, 161, 354, 226, 97, 290, 418, 17, 145, 338, 209, 81, 274, 402, 49, 177, 370, 242, 113, 306, 434, 9, 137, 330, 201, 73, 266, 394, 41, 169, 362, 234, 105, 298, 426, 25, 153, 346, 217, 89, 282, 410, 57, 185, 378, 250, 121, 314, 442, 5, 133, 326, 197, 69, 262, 390, 37, 165, 358, 230, 101, 294, 422, 21, 149, 342, 213, 85, 278, 406, 53, 181, 374, 246, 117, 310, 438, 13, 141, 334, 205, 77, 270, 398, 45, 173, 366, 238, 109, 302, 430, 29, 157, 350, 221, 93, 286, 414, 61, 189, 382, 254, 125, 318, 446, 3, 131, 324, 195, 67, 260, 388, 35, 163, 356, 228, 99, 292, 420, 19, 147, 340, 211, 83, 276, 404, 51, 179, 372, 244, 115, 308, 436, 11, 139, 332, 203, 75, 268, 396, 43, 171, 364, 236, 107, 300, 428, 27, 155, 348, 219, 91, 284, 412, 59, 187, 380, 252, 123, 316, 444, 7, 135, 328, 199, 71, 264, 392, 39, 167, 360, 232, 103, 296, 424, 23, 151, 344, 215, 87, 280, 408, 55, 183, 376, 248, 119, 312, 440, 15, 143, 336, 207, 79, 272, 400, 47, 175, 368, 240, 111, 304, 432, 31, 159, 352, 223, 95, 288, 416, 63, 191, 384, 256, 127, 320, 448]; - - return (unsafe{*PERM449.get_unchecked((index % 449) as usize)} as u32 * 201601 + - unsafe{*PERM449.get_unchecked(((index / 449) % 449) as usize)} as u32 * 449 + - unsafe{*PERM449.get_unchecked(((index / 201601) % 449) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (90518849u32 as f32)); // Results in [0,1). -} - - -fn halton457(index: u32) -> f32 { - const PERM457: [u16; 457] = [0, 128, 329, 192, 64, 265, 393, 32, 160, 361, 233, 96, 297, 425, 16, 144, 345, 208, 80, 281, 409, 48, 176, 377, 249, 112, 313, 441, 224, 8, 136, 337, 200, 72, 273, 401, 40, 168, 369, 241, 104, 305, 433, 24, 152, 353, 216, 88, 289, 417, 56, 184, 385, 257, 120, 321, 449, 4, 132, 333, 196, 68, 269, 397, 36, 164, 365, 237, 100, 301, 429, 20, 148, 349, 212, 84, 285, 413, 52, 180, 381, 253, 116, 317, 445, 229, 12, 140, 341, 204, 76, 277, 405, 44, 172, 373, 245, 108, 309, 437, 28, 156, 357, 220, 92, 293, 421, 60, 188, 389, 261, 124, 325, 453, 2, 130, 331, 194, 66, 267, 395, 34, 162, 363, 235, 98, 299, 427, 18, 146, 347, 210, 82, 283, 411, 50, 178, 379, 251, 114, 315, 443, 226, 10, 138, 339, 202, 74, 275, 403, 42, 170, 371, 243, 106, 307, 435, 26, 154, 355, 218, 90, 291, 419, 58, 186, 387, 259, 122, 323, 451, 6, 134, 335, 198, 70, 271, 399, 38, 166, 367, 239, 102, 303, 431, 22, 150, 351, 214, 86, 287, 415, 54, 182, 383, 255, 118, 319, 447, 231, 14, 142, 343, 206, 78, 279, 407, 46, 174, 375, 247, 110, 311, 439, 30, 158, 359, 222, 94, 295, 423, 62, 190, 391, 263, 126, 327, 455, 228, 1, 129, 330, 193, 65, 266, 394, 33, 161, 362, 234, 97, 298, 426, 17, 145, 346, 209, 81, 282, 410, 49, 177, 378, 250, 113, 314, 442, 225, 9, 137, 338, 201, 73, 274, 402, 41, 169, 370, 242, 105, 306, 434, 25, 153, 354, 217, 89, 290, 418, 57, 185, 386, 258, 121, 322, 450, 5, 133, 334, 197, 69, 270, 398, 37, 165, 366, 238, 101, 302, 430, 21, 149, 350, 213, 85, 286, 414, 53, 181, 382, 254, 117, 318, 446, 230, 13, 141, 342, 205, 77, 278, 406, 45, 173, 374, 246, 109, 310, 438, 29, 157, 358, 221, 93, 294, 422, 61, 189, 390, 262, 125, 326, 454, 3, 131, 332, 195, 67, 268, 396, 35, 163, 364, 236, 99, 300, 428, 19, 147, 348, 211, 83, 284, 412, 51, 179, 380, 252, 115, 316, 444, 227, 11, 139, 340, 203, 75, 276, 404, 43, 171, 372, 244, 107, 308, 436, 27, 155, 356, 219, 91, 292, 420, 59, 187, 388, 260, 123, 324, 452, 7, 135, 336, 199, 71, 272, 400, 39, 167, 368, 240, 103, 304, 432, 23, 151, 352, 215, 87, 288, 416, 55, 183, 384, 256, 119, 320, 448, 232, 15, 143, 344, 207, 79, 280, 408, 47, 175, 376, 248, 111, 312, 440, 31, 159, 360, 223, 95, 296, 424, 63, 191, 392, 264, 127, 328, 456]; - - return (unsafe{*PERM457.get_unchecked((index % 457) as usize)} as u32 * 208849 + - unsafe{*PERM457.get_unchecked(((index / 457) % 457) as usize)} as u32 * 457 + - unsafe{*PERM457.get_unchecked(((index / 208849) % 457) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (95443993u32 as f32)); // Results in [0,1). -} - - -fn halton461(index: u32) -> f32 { - const PERM461: [u16; 461] = [0, 128, 333, 192, 64, 269, 397, 32, 160, 365, 237, 96, 301, 429, 16, 144, 349, 208, 80, 285, 413, 48, 176, 381, 253, 112, 317, 445, 224, 8, 136, 341, 200, 72, 277, 405, 40, 168, 373, 245, 104, 309, 437, 24, 152, 357, 216, 88, 293, 421, 56, 184, 389, 261, 120, 325, 453, 228, 4, 132, 337, 196, 68, 273, 401, 36, 164, 369, 241, 100, 305, 433, 20, 148, 353, 212, 84, 289, 417, 52, 180, 385, 257, 116, 321, 449, 233, 12, 140, 345, 204, 76, 281, 409, 44, 172, 377, 249, 108, 313, 441, 28, 156, 361, 220, 92, 297, 425, 60, 188, 393, 265, 124, 329, 457, 2, 130, 335, 194, 66, 271, 399, 34, 162, 367, 239, 98, 303, 431, 18, 146, 351, 210, 82, 287, 415, 50, 178, 383, 255, 114, 319, 447, 226, 10, 138, 343, 202, 74, 279, 407, 42, 170, 375, 247, 106, 311, 439, 26, 154, 359, 218, 90, 295, 423, 58, 186, 391, 263, 122, 327, 455, 231, 6, 134, 339, 198, 70, 275, 403, 38, 166, 371, 243, 102, 307, 435, 22, 150, 355, 214, 86, 291, 419, 54, 182, 387, 259, 118, 323, 451, 235, 14, 142, 347, 206, 78, 283, 411, 46, 174, 379, 251, 110, 315, 443, 30, 158, 363, 222, 94, 299, 427, 62, 190, 395, 267, 126, 331, 459, 230, 1, 129, 334, 193, 65, 270, 398, 33, 161, 366, 238, 97, 302, 430, 17, 145, 350, 209, 81, 286, 414, 49, 177, 382, 254, 113, 318, 446, 225, 9, 137, 342, 201, 73, 278, 406, 41, 169, 374, 246, 105, 310, 438, 25, 153, 358, 217, 89, 294, 422, 57, 185, 390, 262, 121, 326, 454, 229, 5, 133, 338, 197, 69, 274, 402, 37, 165, 370, 242, 101, 306, 434, 21, 149, 354, 213, 85, 290, 418, 53, 181, 386, 258, 117, 322, 450, 234, 13, 141, 346, 205, 77, 282, 410, 45, 173, 378, 250, 109, 314, 442, 29, 157, 362, 221, 93, 298, 426, 61, 189, 394, 266, 125, 330, 458, 3, 131, 336, 195, 67, 272, 400, 35, 163, 368, 240, 99, 304, 432, 19, 147, 352, 211, 83, 288, 416, 51, 179, 384, 256, 115, 320, 448, 227, 11, 139, 344, 203, 75, 280, 408, 43, 171, 376, 248, 107, 312, 440, 27, 155, 360, 219, 91, 296, 424, 59, 187, 392, 264, 123, 328, 456, 232, 7, 135, 340, 199, 71, 276, 404, 39, 167, 372, 244, 103, 308, 436, 23, 151, 356, 215, 87, 292, 420, 55, 183, 388, 260, 119, 324, 452, 236, 15, 143, 348, 207, 79, 284, 412, 47, 175, 380, 252, 111, 316, 444, 31, 159, 364, 223, 95, 300, 428, 63, 191, 396, 268, 127, 332, 460]; - - return (unsafe{*PERM461.get_unchecked((index % 461) as usize)} as u32 * 212521 + - unsafe{*PERM461.get_unchecked(((index / 461) % 461) as usize)} as u32 * 461 + - unsafe{*PERM461.get_unchecked(((index / 212521) % 461) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (97972181u32 as f32)); // Results in [0,1). -} - - -fn halton463(index: u32) -> f32 { - const PERM463: [u16; 463] = [0, 128, 335, 192, 64, 271, 399, 32, 160, 367, 239, 96, 303, 431, 16, 144, 351, 208, 80, 287, 415, 48, 176, 383, 255, 112, 319, 447, 224, 8, 136, 343, 200, 72, 279, 407, 40, 168, 375, 247, 104, 311, 439, 24, 152, 359, 216, 88, 295, 423, 56, 184, 391, 263, 120, 327, 455, 228, 4, 132, 339, 196, 68, 275, 403, 36, 164, 371, 243, 100, 307, 435, 20, 148, 355, 212, 84, 291, 419, 52, 180, 387, 259, 116, 323, 451, 235, 12, 140, 347, 204, 76, 283, 411, 44, 172, 379, 251, 108, 315, 443, 28, 156, 363, 220, 92, 299, 427, 60, 188, 395, 267, 124, 331, 459, 230, 2, 130, 337, 194, 66, 273, 401, 34, 162, 369, 241, 98, 305, 433, 18, 146, 353, 210, 82, 289, 417, 50, 178, 385, 257, 114, 321, 449, 226, 10, 138, 345, 202, 74, 281, 409, 42, 170, 377, 249, 106, 313, 441, 26, 154, 361, 218, 90, 297, 425, 58, 186, 393, 265, 122, 329, 457, 233, 6, 134, 341, 198, 70, 277, 405, 38, 166, 373, 245, 102, 309, 437, 22, 150, 357, 214, 86, 293, 421, 54, 182, 389, 261, 118, 325, 453, 237, 14, 142, 349, 206, 78, 285, 413, 46, 174, 381, 253, 110, 317, 445, 30, 158, 365, 222, 94, 301, 429, 62, 190, 397, 269, 126, 333, 461, 231, 1, 129, 336, 193, 65, 272, 400, 33, 161, 368, 240, 97, 304, 432, 17, 145, 352, 209, 81, 288, 416, 49, 177, 384, 256, 113, 320, 448, 225, 9, 137, 344, 201, 73, 280, 408, 41, 169, 376, 248, 105, 312, 440, 25, 153, 360, 217, 89, 296, 424, 57, 185, 392, 264, 121, 328, 456, 229, 5, 133, 340, 197, 69, 276, 404, 37, 165, 372, 244, 101, 308, 436, 21, 149, 356, 213, 85, 292, 420, 53, 181, 388, 260, 117, 324, 452, 236, 13, 141, 348, 205, 77, 284, 412, 45, 173, 380, 252, 109, 316, 444, 29, 157, 364, 221, 93, 300, 428, 61, 189, 396, 268, 125, 332, 460, 232, 3, 131, 338, 195, 67, 274, 402, 35, 163, 370, 242, 99, 306, 434, 19, 147, 354, 211, 83, 290, 418, 51, 179, 386, 258, 115, 322, 450, 227, 11, 139, 346, 203, 75, 282, 410, 43, 171, 378, 250, 107, 314, 442, 27, 155, 362, 219, 91, 298, 426, 59, 187, 394, 266, 123, 330, 458, 234, 7, 135, 342, 199, 71, 278, 406, 39, 167, 374, 246, 103, 310, 438, 23, 151, 358, 215, 87, 294, 422, 55, 183, 390, 262, 119, 326, 454, 238, 15, 143, 350, 207, 79, 286, 414, 47, 175, 382, 254, 111, 318, 446, 31, 159, 366, 223, 95, 302, 430, 63, 191, 398, 270, 127, 334, 462]; - - return (unsafe{*PERM463.get_unchecked((index % 463) as usize)} as u32 * 214369 + - unsafe{*PERM463.get_unchecked(((index / 463) % 463) as usize)} as u32 * 463 + - unsafe{*PERM463.get_unchecked(((index / 214369) % 463) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (99252847u32 as f32)); // Results in [0,1). -} - - -fn halton467(index: u32) -> f32 { - const PERM467: [u16; 467] = [0, 128, 339, 192, 64, 275, 403, 32, 160, 371, 243, 96, 307, 435, 224, 16, 144, 355, 208, 80, 291, 419, 48, 176, 387, 259, 112, 323, 451, 8, 136, 347, 200, 72, 283, 411, 40, 168, 379, 251, 104, 315, 443, 235, 24, 152, 363, 216, 88, 299, 427, 56, 184, 395, 267, 120, 331, 459, 4, 132, 343, 196, 68, 279, 407, 36, 164, 375, 247, 100, 311, 439, 228, 20, 148, 359, 212, 84, 295, 423, 52, 180, 391, 263, 116, 327, 455, 12, 140, 351, 204, 76, 287, 415, 44, 172, 383, 255, 108, 319, 447, 239, 28, 156, 367, 220, 92, 303, 431, 60, 188, 399, 271, 124, 335, 463, 232, 2, 130, 341, 194, 66, 277, 405, 34, 162, 373, 245, 98, 309, 437, 226, 18, 146, 357, 210, 82, 293, 421, 50, 178, 389, 261, 114, 325, 453, 10, 138, 349, 202, 74, 285, 413, 42, 170, 381, 253, 106, 317, 445, 237, 26, 154, 365, 218, 90, 301, 429, 58, 186, 397, 269, 122, 333, 461, 6, 134, 345, 198, 70, 281, 409, 38, 166, 377, 249, 102, 313, 441, 230, 22, 150, 361, 214, 86, 297, 425, 54, 182, 393, 265, 118, 329, 457, 14, 142, 353, 206, 78, 289, 417, 46, 174, 385, 257, 110, 321, 449, 241, 30, 158, 369, 222, 94, 305, 433, 62, 190, 401, 273, 126, 337, 465, 233, 1, 129, 340, 193, 65, 276, 404, 33, 161, 372, 244, 97, 308, 436, 225, 17, 145, 356, 209, 81, 292, 420, 49, 177, 388, 260, 113, 324, 452, 9, 137, 348, 201, 73, 284, 412, 41, 169, 380, 252, 105, 316, 444, 236, 25, 153, 364, 217, 89, 300, 428, 57, 185, 396, 268, 121, 332, 460, 5, 133, 344, 197, 69, 280, 408, 37, 165, 376, 248, 101, 312, 440, 229, 21, 149, 360, 213, 85, 296, 424, 53, 181, 392, 264, 117, 328, 456, 13, 141, 352, 205, 77, 288, 416, 45, 173, 384, 256, 109, 320, 448, 240, 29, 157, 368, 221, 93, 304, 432, 61, 189, 400, 272, 125, 336, 464, 234, 3, 131, 342, 195, 67, 278, 406, 35, 163, 374, 246, 99, 310, 438, 227, 19, 147, 358, 211, 83, 294, 422, 51, 179, 390, 262, 115, 326, 454, 11, 139, 350, 203, 75, 286, 414, 43, 171, 382, 254, 107, 318, 446, 238, 27, 155, 366, 219, 91, 302, 430, 59, 187, 398, 270, 123, 334, 462, 7, 135, 346, 199, 71, 282, 410, 39, 167, 378, 250, 103, 314, 442, 231, 23, 151, 362, 215, 87, 298, 426, 55, 183, 394, 266, 119, 330, 458, 15, 143, 354, 207, 79, 290, 418, 47, 175, 386, 258, 111, 322, 450, 242, 31, 159, 370, 223, 95, 306, 434, 63, 191, 402, 274, 127, 338, 466]; - - return (unsafe{*PERM467.get_unchecked((index % 467) as usize)} as u32 * 218089 + - unsafe{*PERM467.get_unchecked(((index / 467) % 467) as usize)} as u32 * 467 + - unsafe{*PERM467.get_unchecked(((index / 218089) % 467) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (101847563u32 as f32)); // Results in [0,1). -} - - -fn halton479(index: u32) -> f32 { - const PERM479: [u16; 479] = [0, 128, 351, 192, 64, 287, 415, 32, 160, 383, 255, 96, 319, 447, 224, 16, 144, 367, 208, 80, 303, 431, 48, 176, 399, 271, 112, 335, 463, 232, 8, 136, 359, 200, 72, 295, 423, 40, 168, 391, 263, 104, 327, 455, 247, 24, 152, 375, 216, 88, 311, 439, 56, 184, 407, 279, 120, 343, 471, 236, 4, 132, 355, 196, 68, 291, 419, 36, 164, 387, 259, 100, 323, 451, 228, 20, 148, 371, 212, 84, 307, 435, 52, 180, 403, 275, 116, 339, 467, 243, 12, 140, 363, 204, 76, 299, 427, 44, 172, 395, 267, 108, 331, 459, 251, 28, 156, 379, 220, 92, 315, 443, 60, 188, 411, 283, 124, 347, 475, 238, 2, 130, 353, 194, 66, 289, 417, 34, 162, 385, 257, 98, 321, 449, 226, 18, 146, 369, 210, 82, 305, 433, 50, 178, 401, 273, 114, 337, 465, 234, 10, 138, 361, 202, 74, 297, 425, 42, 170, 393, 265, 106, 329, 457, 249, 26, 154, 377, 218, 90, 313, 441, 58, 186, 409, 281, 122, 345, 473, 241, 6, 134, 357, 198, 70, 293, 421, 38, 166, 389, 261, 102, 325, 453, 230, 22, 150, 373, 214, 86, 309, 437, 54, 182, 405, 277, 118, 341, 469, 245, 14, 142, 365, 206, 78, 301, 429, 46, 174, 397, 269, 110, 333, 461, 253, 30, 158, 381, 222, 94, 317, 445, 62, 190, 413, 285, 126, 349, 477, 239, 1, 129, 352, 193, 65, 288, 416, 33, 161, 384, 256, 97, 320, 448, 225, 17, 145, 368, 209, 81, 304, 432, 49, 177, 400, 272, 113, 336, 464, 233, 9, 137, 360, 201, 73, 296, 424, 41, 169, 392, 264, 105, 328, 456, 248, 25, 153, 376, 217, 89, 312, 440, 57, 185, 408, 280, 121, 344, 472, 237, 5, 133, 356, 197, 69, 292, 420, 37, 165, 388, 260, 101, 324, 452, 229, 21, 149, 372, 213, 85, 308, 436, 53, 181, 404, 276, 117, 340, 468, 244, 13, 141, 364, 205, 77, 300, 428, 45, 173, 396, 268, 109, 332, 460, 252, 29, 157, 380, 221, 93, 316, 444, 61, 189, 412, 284, 125, 348, 476, 240, 3, 131, 354, 195, 67, 290, 418, 35, 163, 386, 258, 99, 322, 450, 227, 19, 147, 370, 211, 83, 306, 434, 51, 179, 402, 274, 115, 338, 466, 235, 11, 139, 362, 203, 75, 298, 426, 43, 171, 394, 266, 107, 330, 458, 250, 27, 155, 378, 219, 91, 314, 442, 59, 187, 410, 282, 123, 346, 474, 242, 7, 135, 358, 199, 71, 294, 422, 39, 167, 390, 262, 103, 326, 454, 231, 23, 151, 374, 215, 87, 310, 438, 55, 183, 406, 278, 119, 342, 470, 246, 15, 143, 366, 207, 79, 302, 430, 47, 175, 398, 270, 111, 334, 462, 254, 31, 159, 382, 223, 95, 318, 446, 63, 191, 414, 286, 127, 350, 478]; - - return (unsafe{*PERM479.get_unchecked((index % 479) as usize)} as u32 * 229441 + - unsafe{*PERM479.get_unchecked(((index / 479) % 479) as usize)} as u32 * 479 + - unsafe{*PERM479.get_unchecked(((index / 229441) % 479) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (109902239u32 as f32)); // Results in [0,1). -} - - -fn halton487(index: u32) -> f32 { - const PERM487: [u16; 487] = [0, 128, 359, 192, 64, 295, 423, 224, 32, 160, 391, 263, 96, 327, 455, 16, 144, 375, 208, 80, 311, 439, 247, 48, 176, 407, 279, 112, 343, 471, 8, 136, 367, 200, 72, 303, 431, 232, 40, 168, 399, 271, 104, 335, 463, 24, 152, 383, 216, 88, 319, 447, 255, 56, 184, 415, 287, 120, 351, 479, 240, 4, 132, 363, 196, 68, 299, 427, 228, 36, 164, 395, 267, 100, 331, 459, 20, 148, 379, 212, 84, 315, 443, 251, 52, 180, 411, 283, 116, 347, 475, 12, 140, 371, 204, 76, 307, 435, 236, 44, 172, 403, 275, 108, 339, 467, 28, 156, 387, 220, 92, 323, 451, 259, 60, 188, 419, 291, 124, 355, 483, 242, 2, 130, 361, 194, 66, 297, 425, 226, 34, 162, 393, 265, 98, 329, 457, 18, 146, 377, 210, 82, 313, 441, 249, 50, 178, 409, 281, 114, 345, 473, 10, 138, 369, 202, 74, 305, 433, 234, 42, 170, 401, 273, 106, 337, 465, 26, 154, 385, 218, 90, 321, 449, 257, 58, 186, 417, 289, 122, 353, 481, 245, 6, 134, 365, 198, 70, 301, 429, 230, 38, 166, 397, 269, 102, 333, 461, 22, 150, 381, 214, 86, 317, 445, 253, 54, 182, 413, 285, 118, 349, 477, 14, 142, 373, 206, 78, 309, 437, 238, 46, 174, 405, 277, 110, 341, 469, 30, 158, 389, 222, 94, 325, 453, 261, 62, 190, 421, 293, 126, 357, 485, 243, 1, 129, 360, 193, 65, 296, 424, 225, 33, 161, 392, 264, 97, 328, 456, 17, 145, 376, 209, 81, 312, 440, 248, 49, 177, 408, 280, 113, 344, 472, 9, 137, 368, 201, 73, 304, 432, 233, 41, 169, 400, 272, 105, 336, 464, 25, 153, 384, 217, 89, 320, 448, 256, 57, 185, 416, 288, 121, 352, 480, 241, 5, 133, 364, 197, 69, 300, 428, 229, 37, 165, 396, 268, 101, 332, 460, 21, 149, 380, 213, 85, 316, 444, 252, 53, 181, 412, 284, 117, 348, 476, 13, 141, 372, 205, 77, 308, 436, 237, 45, 173, 404, 276, 109, 340, 468, 29, 157, 388, 221, 93, 324, 452, 260, 61, 189, 420, 292, 125, 356, 484, 244, 3, 131, 362, 195, 67, 298, 426, 227, 35, 163, 394, 266, 99, 330, 458, 19, 147, 378, 211, 83, 314, 442, 250, 51, 179, 410, 282, 115, 346, 474, 11, 139, 370, 203, 75, 306, 434, 235, 43, 171, 402, 274, 107, 338, 466, 27, 155, 386, 219, 91, 322, 450, 258, 59, 187, 418, 290, 123, 354, 482, 246, 7, 135, 366, 199, 71, 302, 430, 231, 39, 167, 398, 270, 103, 334, 462, 23, 151, 382, 215, 87, 318, 446, 254, 55, 183, 414, 286, 119, 350, 478, 15, 143, 374, 207, 79, 310, 438, 239, 47, 175, 406, 278, 111, 342, 470, 31, 159, 390, 223, 95, 326, 454, 262, 63, 191, 422, 294, 127, 358, 486]; - - return (unsafe{*PERM487.get_unchecked((index % 487) as usize)} as u32 * 237169 + - unsafe{*PERM487.get_unchecked(((index / 487) % 487) as usize)} as u32 * 487 + - unsafe{*PERM487.get_unchecked(((index / 237169) % 487) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (115501303u32 as f32)); // Results in [0,1). -} - - -fn halton491(index: u32) -> f32 { - const PERM491: [u16; 491] = [0, 128, 363, 192, 64, 299, 427, 224, 32, 160, 395, 267, 96, 331, 459, 16, 144, 379, 208, 80, 315, 443, 251, 48, 176, 411, 283, 112, 347, 475, 240, 8, 136, 371, 200, 72, 307, 435, 232, 40, 168, 403, 275, 104, 339, 467, 24, 152, 387, 216, 88, 323, 451, 259, 56, 184, 419, 291, 120, 355, 483, 4, 132, 367, 196, 68, 303, 431, 228, 36, 164, 399, 271, 100, 335, 463, 20, 148, 383, 212, 84, 319, 447, 255, 52, 180, 415, 287, 116, 351, 479, 247, 12, 140, 375, 204, 76, 311, 439, 236, 44, 172, 407, 279, 108, 343, 471, 28, 156, 391, 220, 92, 327, 455, 263, 60, 188, 423, 295, 124, 359, 487, 244, 2, 130, 365, 194, 66, 301, 429, 226, 34, 162, 397, 269, 98, 333, 461, 18, 146, 381, 210, 82, 317, 445, 253, 50, 178, 413, 285, 114, 349, 477, 242, 10, 138, 373, 202, 74, 309, 437, 234, 42, 170, 405, 277, 106, 341, 469, 26, 154, 389, 218, 90, 325, 453, 261, 58, 186, 421, 293, 122, 357, 485, 6, 134, 369, 198, 70, 305, 433, 230, 38, 166, 401, 273, 102, 337, 465, 22, 150, 385, 214, 86, 321, 449, 257, 54, 182, 417, 289, 118, 353, 481, 249, 14, 142, 377, 206, 78, 313, 441, 238, 46, 174, 409, 281, 110, 345, 473, 30, 158, 393, 222, 94, 329, 457, 265, 62, 190, 425, 297, 126, 361, 489, 245, 1, 129, 364, 193, 65, 300, 428, 225, 33, 161, 396, 268, 97, 332, 460, 17, 145, 380, 209, 81, 316, 444, 252, 49, 177, 412, 284, 113, 348, 476, 241, 9, 137, 372, 201, 73, 308, 436, 233, 41, 169, 404, 276, 105, 340, 468, 25, 153, 388, 217, 89, 324, 452, 260, 57, 185, 420, 292, 121, 356, 484, 5, 133, 368, 197, 69, 304, 432, 229, 37, 165, 400, 272, 101, 336, 464, 21, 149, 384, 213, 85, 320, 448, 256, 53, 181, 416, 288, 117, 352, 480, 248, 13, 141, 376, 205, 77, 312, 440, 237, 45, 173, 408, 280, 109, 344, 472, 29, 157, 392, 221, 93, 328, 456, 264, 61, 189, 424, 296, 125, 360, 488, 246, 3, 131, 366, 195, 67, 302, 430, 227, 35, 163, 398, 270, 99, 334, 462, 19, 147, 382, 211, 83, 318, 446, 254, 51, 179, 414, 286, 115, 350, 478, 243, 11, 139, 374, 203, 75, 310, 438, 235, 43, 171, 406, 278, 107, 342, 470, 27, 155, 390, 219, 91, 326, 454, 262, 59, 187, 422, 294, 123, 358, 486, 7, 135, 370, 199, 71, 306, 434, 231, 39, 167, 402, 274, 103, 338, 466, 23, 151, 386, 215, 87, 322, 450, 258, 55, 183, 418, 290, 119, 354, 482, 250, 15, 143, 378, 207, 79, 314, 442, 239, 47, 175, 410, 282, 111, 346, 474, 31, 159, 394, 223, 95, 330, 458, 266, 63, 191, 426, 298, 127, 362, 490]; - - return (unsafe{*PERM491.get_unchecked((index % 491) as usize)} as u32 * 241081 + - unsafe{*PERM491.get_unchecked(((index / 491) % 491) as usize)} as u32 * 491 + - unsafe{*PERM491.get_unchecked(((index / 241081) % 491) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (118370771u32 as f32)); // Results in [0,1). -} - - -fn halton499(index: u32) -> f32 { - const PERM499: [u16; 499] = [0, 128, 371, 192, 64, 307, 435, 224, 32, 160, 403, 275, 96, 339, 467, 240, 16, 144, 387, 208, 80, 323, 451, 259, 48, 176, 419, 291, 112, 355, 483, 8, 136, 379, 200, 72, 315, 443, 232, 40, 168, 411, 283, 104, 347, 475, 251, 24, 152, 395, 216, 88, 331, 459, 267, 56, 184, 427, 299, 120, 363, 491, 4, 132, 375, 196, 68, 311, 439, 228, 36, 164, 407, 279, 100, 343, 471, 244, 20, 148, 391, 212, 84, 327, 455, 263, 52, 180, 423, 295, 116, 359, 487, 12, 140, 383, 204, 76, 319, 447, 236, 44, 172, 415, 287, 108, 351, 479, 255, 28, 156, 399, 220, 92, 335, 463, 271, 60, 188, 431, 303, 124, 367, 495, 248, 2, 130, 373, 194, 66, 309, 437, 226, 34, 162, 405, 277, 98, 341, 469, 242, 18, 146, 389, 210, 82, 325, 453, 261, 50, 178, 421, 293, 114, 357, 485, 10, 138, 381, 202, 74, 317, 445, 234, 42, 170, 413, 285, 106, 349, 477, 253, 26, 154, 397, 218, 90, 333, 461, 269, 58, 186, 429, 301, 122, 365, 493, 6, 134, 377, 198, 70, 313, 441, 230, 38, 166, 409, 281, 102, 345, 473, 246, 22, 150, 393, 214, 86, 329, 457, 265, 54, 182, 425, 297, 118, 361, 489, 14, 142, 385, 206, 78, 321, 449, 238, 46, 174, 417, 289, 110, 353, 481, 257, 30, 158, 401, 222, 94, 337, 465, 273, 62, 190, 433, 305, 126, 369, 497, 249, 1, 129, 372, 193, 65, 308, 436, 225, 33, 161, 404, 276, 97, 340, 468, 241, 17, 145, 388, 209, 81, 324, 452, 260, 49, 177, 420, 292, 113, 356, 484, 9, 137, 380, 201, 73, 316, 444, 233, 41, 169, 412, 284, 105, 348, 476, 252, 25, 153, 396, 217, 89, 332, 460, 268, 57, 185, 428, 300, 121, 364, 492, 5, 133, 376, 197, 69, 312, 440, 229, 37, 165, 408, 280, 101, 344, 472, 245, 21, 149, 392, 213, 85, 328, 456, 264, 53, 181, 424, 296, 117, 360, 488, 13, 141, 384, 205, 77, 320, 448, 237, 45, 173, 416, 288, 109, 352, 480, 256, 29, 157, 400, 221, 93, 336, 464, 272, 61, 189, 432, 304, 125, 368, 496, 250, 3, 131, 374, 195, 67, 310, 438, 227, 35, 163, 406, 278, 99, 342, 470, 243, 19, 147, 390, 211, 83, 326, 454, 262, 51, 179, 422, 294, 115, 358, 486, 11, 139, 382, 203, 75, 318, 446, 235, 43, 171, 414, 286, 107, 350, 478, 254, 27, 155, 398, 219, 91, 334, 462, 270, 59, 187, 430, 302, 123, 366, 494, 7, 135, 378, 199, 71, 314, 442, 231, 39, 167, 410, 282, 103, 346, 474, 247, 23, 151, 394, 215, 87, 330, 458, 266, 55, 183, 426, 298, 119, 362, 490, 15, 143, 386, 207, 79, 322, 450, 239, 47, 175, 418, 290, 111, 354, 482, 258, 31, 159, 402, 223, 95, 338, 466, 274, 63, 191, 434, 306, 127, 370, 498]; - - return (unsafe{*PERM499.get_unchecked((index % 499) as usize)} as u32 * 249001 + - unsafe{*PERM499.get_unchecked(((index / 499) % 499) as usize)} as u32 * 499 + - unsafe{*PERM499.get_unchecked(((index / 249001) % 499) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (124251499u32 as f32)); // Results in [0,1). -} - - -fn halton503(index: u32) -> f32 { - const PERM503: [u16; 503] = [0, 128, 375, 192, 64, 311, 439, 224, 32, 160, 407, 279, 96, 343, 471, 240, 16, 144, 391, 208, 80, 327, 455, 263, 48, 176, 423, 295, 112, 359, 487, 8, 136, 383, 200, 72, 319, 447, 232, 40, 168, 415, 287, 104, 351, 479, 255, 24, 152, 399, 216, 88, 335, 463, 271, 56, 184, 431, 303, 120, 367, 495, 248, 4, 132, 379, 196, 68, 315, 443, 228, 36, 164, 411, 283, 100, 347, 475, 244, 20, 148, 395, 212, 84, 331, 459, 267, 52, 180, 427, 299, 116, 363, 491, 12, 140, 387, 204, 76, 323, 451, 236, 44, 172, 419, 291, 108, 355, 483, 259, 28, 156, 403, 220, 92, 339, 467, 275, 60, 188, 435, 307, 124, 371, 499, 250, 2, 130, 377, 194, 66, 313, 441, 226, 34, 162, 409, 281, 98, 345, 473, 242, 18, 146, 393, 210, 82, 329, 457, 265, 50, 178, 425, 297, 114, 361, 489, 10, 138, 385, 202, 74, 321, 449, 234, 42, 170, 417, 289, 106, 353, 481, 257, 26, 154, 401, 218, 90, 337, 465, 273, 58, 186, 433, 305, 122, 369, 497, 253, 6, 134, 381, 198, 70, 317, 445, 230, 38, 166, 413, 285, 102, 349, 477, 246, 22, 150, 397, 214, 86, 333, 461, 269, 54, 182, 429, 301, 118, 365, 493, 14, 142, 389, 206, 78, 325, 453, 238, 46, 174, 421, 293, 110, 357, 485, 261, 30, 158, 405, 222, 94, 341, 469, 277, 62, 190, 437, 309, 126, 373, 501, 251, 1, 129, 376, 193, 65, 312, 440, 225, 33, 161, 408, 280, 97, 344, 472, 241, 17, 145, 392, 209, 81, 328, 456, 264, 49, 177, 424, 296, 113, 360, 488, 9, 137, 384, 201, 73, 320, 448, 233, 41, 169, 416, 288, 105, 352, 480, 256, 25, 153, 400, 217, 89, 336, 464, 272, 57, 185, 432, 304, 121, 368, 496, 249, 5, 133, 380, 197, 69, 316, 444, 229, 37, 165, 412, 284, 101, 348, 476, 245, 21, 149, 396, 213, 85, 332, 460, 268, 53, 181, 428, 300, 117, 364, 492, 13, 141, 388, 205, 77, 324, 452, 237, 45, 173, 420, 292, 109, 356, 484, 260, 29, 157, 404, 221, 93, 340, 468, 276, 61, 189, 436, 308, 125, 372, 500, 252, 3, 131, 378, 195, 67, 314, 442, 227, 35, 163, 410, 282, 99, 346, 474, 243, 19, 147, 394, 211, 83, 330, 458, 266, 51, 179, 426, 298, 115, 362, 490, 11, 139, 386, 203, 75, 322, 450, 235, 43, 171, 418, 290, 107, 354, 482, 258, 27, 155, 402, 219, 91, 338, 466, 274, 59, 187, 434, 306, 123, 370, 498, 254, 7, 135, 382, 199, 71, 318, 446, 231, 39, 167, 414, 286, 103, 350, 478, 247, 23, 151, 398, 215, 87, 334, 462, 270, 55, 183, 430, 302, 119, 366, 494, 15, 143, 390, 207, 79, 326, 454, 239, 47, 175, 422, 294, 111, 358, 486, 262, 31, 159, 406, 223, 95, 342, 470, 278, 63, 191, 438, 310, 127, 374, 502]; - - return (unsafe{*PERM503.get_unchecked((index % 503) as usize)} as u32 * 253009 + - unsafe{*PERM503.get_unchecked(((index / 503) % 503) as usize)} as u32 * 503 + - unsafe{*PERM503.get_unchecked(((index / 253009) % 503) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (127263527u32 as f32)); // Results in [0,1). -} - - -fn halton509(index: u32) -> f32 { - const PERM509: [u16; 509] = [0, 128, 381, 192, 64, 317, 445, 224, 32, 160, 413, 285, 96, 349, 477, 240, 16, 144, 397, 208, 80, 333, 461, 269, 48, 176, 429, 301, 112, 365, 493, 248, 8, 136, 389, 200, 72, 325, 453, 232, 40, 168, 421, 293, 104, 357, 485, 261, 24, 152, 405, 216, 88, 341, 469, 277, 56, 184, 437, 309, 120, 373, 501, 252, 4, 132, 385, 196, 68, 321, 449, 228, 36, 164, 417, 289, 100, 353, 481, 244, 20, 148, 401, 212, 84, 337, 465, 273, 52, 180, 433, 305, 116, 369, 497, 257, 12, 140, 393, 204, 76, 329, 457, 236, 44, 172, 425, 297, 108, 361, 489, 265, 28, 156, 409, 220, 92, 345, 473, 281, 60, 188, 441, 313, 124, 377, 505, 2, 130, 383, 194, 66, 319, 447, 226, 34, 162, 415, 287, 98, 351, 479, 242, 18, 146, 399, 210, 82, 335, 463, 271, 50, 178, 431, 303, 114, 367, 495, 250, 10, 138, 391, 202, 74, 327, 455, 234, 42, 170, 423, 295, 106, 359, 487, 263, 26, 154, 407, 218, 90, 343, 471, 279, 58, 186, 439, 311, 122, 375, 503, 255, 6, 134, 387, 198, 70, 323, 451, 230, 38, 166, 419, 291, 102, 355, 483, 246, 22, 150, 403, 214, 86, 339, 467, 275, 54, 182, 435, 307, 118, 371, 499, 259, 14, 142, 395, 206, 78, 331, 459, 238, 46, 174, 427, 299, 110, 363, 491, 267, 30, 158, 411, 222, 94, 347, 475, 283, 62, 190, 443, 315, 126, 379, 507, 254, 1, 129, 382, 193, 65, 318, 446, 225, 33, 161, 414, 286, 97, 350, 478, 241, 17, 145, 398, 209, 81, 334, 462, 270, 49, 177, 430, 302, 113, 366, 494, 249, 9, 137, 390, 201, 73, 326, 454, 233, 41, 169, 422, 294, 105, 358, 486, 262, 25, 153, 406, 217, 89, 342, 470, 278, 57, 185, 438, 310, 121, 374, 502, 253, 5, 133, 386, 197, 69, 322, 450, 229, 37, 165, 418, 290, 101, 354, 482, 245, 21, 149, 402, 213, 85, 338, 466, 274, 53, 181, 434, 306, 117, 370, 498, 258, 13, 141, 394, 205, 77, 330, 458, 237, 45, 173, 426, 298, 109, 362, 490, 266, 29, 157, 410, 221, 93, 346, 474, 282, 61, 189, 442, 314, 125, 378, 506, 3, 131, 384, 195, 67, 320, 448, 227, 35, 163, 416, 288, 99, 352, 480, 243, 19, 147, 400, 211, 83, 336, 464, 272, 51, 179, 432, 304, 115, 368, 496, 251, 11, 139, 392, 203, 75, 328, 456, 235, 43, 171, 424, 296, 107, 360, 488, 264, 27, 155, 408, 219, 91, 344, 472, 280, 59, 187, 440, 312, 123, 376, 504, 256, 7, 135, 388, 199, 71, 324, 452, 231, 39, 167, 420, 292, 103, 356, 484, 247, 23, 151, 404, 215, 87, 340, 468, 276, 55, 183, 436, 308, 119, 372, 500, 260, 15, 143, 396, 207, 79, 332, 460, 239, 47, 175, 428, 300, 111, 364, 492, 268, 31, 159, 412, 223, 95, 348, 476, 284, 63, 191, 444, 316, 127, 380, 508]; - - return (unsafe{*PERM509.get_unchecked((index % 509) as usize)} as u32 * 259081 + - unsafe{*PERM509.get_unchecked(((index / 509) % 509) as usize)} as u32 * 509 + - unsafe{*PERM509.get_unchecked(((index / 259081) % 509) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (131872229u32 as f32)); // Results in [0,1). -} - - -fn halton521(index: u32) -> f32 { - const PERM521: [u16; 521] = [0, 265, 128, 393, 64, 329, 192, 457, 32, 297, 160, 425, 96, 361, 224, 489, 16, 281, 144, 409, 80, 345, 208, 473, 48, 313, 176, 441, 112, 377, 240, 505, 256, 8, 273, 136, 401, 72, 337, 200, 465, 40, 305, 168, 433, 104, 369, 232, 497, 24, 289, 152, 417, 88, 353, 216, 481, 56, 321, 184, 449, 120, 385, 248, 513, 4, 269, 132, 397, 68, 333, 196, 461, 36, 301, 164, 429, 100, 365, 228, 493, 20, 285, 148, 413, 84, 349, 212, 477, 52, 317, 180, 445, 116, 381, 244, 509, 261, 12, 277, 140, 405, 76, 341, 204, 469, 44, 309, 172, 437, 108, 373, 236, 501, 28, 293, 156, 421, 92, 357, 220, 485, 60, 325, 188, 453, 124, 389, 252, 517, 2, 267, 130, 395, 66, 331, 194, 459, 34, 299, 162, 427, 98, 363, 226, 491, 18, 283, 146, 411, 82, 347, 210, 475, 50, 315, 178, 443, 114, 379, 242, 507, 258, 10, 275, 138, 403, 74, 339, 202, 467, 42, 307, 170, 435, 106, 371, 234, 499, 26, 291, 154, 419, 90, 355, 218, 483, 58, 323, 186, 451, 122, 387, 250, 515, 6, 271, 134, 399, 70, 335, 198, 463, 38, 303, 166, 431, 102, 367, 230, 495, 22, 287, 150, 415, 86, 351, 214, 479, 54, 319, 182, 447, 118, 383, 246, 511, 263, 14, 279, 142, 407, 78, 343, 206, 471, 46, 311, 174, 439, 110, 375, 238, 503, 30, 295, 158, 423, 94, 359, 222, 487, 62, 327, 190, 455, 126, 391, 254, 519, 260, 1, 266, 129, 394, 65, 330, 193, 458, 33, 298, 161, 426, 97, 362, 225, 490, 17, 282, 145, 410, 81, 346, 209, 474, 49, 314, 177, 442, 113, 378, 241, 506, 257, 9, 274, 137, 402, 73, 338, 201, 466, 41, 306, 169, 434, 105, 370, 233, 498, 25, 290, 153, 418, 89, 354, 217, 482, 57, 322, 185, 450, 121, 386, 249, 514, 5, 270, 133, 398, 69, 334, 197, 462, 37, 302, 165, 430, 101, 366, 229, 494, 21, 286, 149, 414, 85, 350, 213, 478, 53, 318, 181, 446, 117, 382, 245, 510, 262, 13, 278, 141, 406, 77, 342, 205, 470, 45, 310, 173, 438, 109, 374, 237, 502, 29, 294, 157, 422, 93, 358, 221, 486, 61, 326, 189, 454, 125, 390, 253, 518, 3, 268, 131, 396, 67, 332, 195, 460, 35, 300, 163, 428, 99, 364, 227, 492, 19, 284, 147, 412, 83, 348, 211, 476, 51, 316, 179, 444, 115, 380, 243, 508, 259, 11, 276, 139, 404, 75, 340, 203, 468, 43, 308, 171, 436, 107, 372, 235, 500, 27, 292, 155, 420, 91, 356, 219, 484, 59, 324, 187, 452, 123, 388, 251, 516, 7, 272, 135, 400, 71, 336, 199, 464, 39, 304, 167, 432, 103, 368, 231, 496, 23, 288, 151, 416, 87, 352, 215, 480, 55, 320, 183, 448, 119, 384, 247, 512, 264, 15, 280, 143, 408, 79, 344, 207, 472, 47, 312, 175, 440, 111, 376, 239, 504, 31, 296, 159, 424, 95, 360, 223, 488, 63, 328, 191, 456, 127, 392, 255, 520]; - - return (unsafe{*PERM521.get_unchecked((index % 521) as usize)} as u32 * 271441 + - unsafe{*PERM521.get_unchecked(((index / 521) % 521) as usize)} as u32 * 521 + - unsafe{*PERM521.get_unchecked(((index / 271441) % 521) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (141420761u32 as f32)); // Results in [0,1). -} - - -fn halton523(index: u32) -> f32 { - const PERM523: [u16; 523] = [0, 267, 128, 395, 64, 331, 192, 459, 32, 299, 160, 427, 96, 363, 224, 491, 16, 283, 144, 411, 80, 347, 208, 475, 48, 315, 176, 443, 112, 379, 240, 507, 256, 8, 275, 136, 403, 72, 339, 200, 467, 40, 307, 168, 435, 104, 371, 232, 499, 24, 291, 152, 419, 88, 355, 216, 483, 56, 323, 184, 451, 120, 387, 248, 515, 4, 271, 132, 399, 68, 335, 196, 463, 36, 303, 164, 431, 100, 367, 228, 495, 20, 287, 148, 415, 84, 351, 212, 479, 52, 319, 180, 447, 116, 383, 244, 511, 263, 12, 279, 140, 407, 76, 343, 204, 471, 44, 311, 172, 439, 108, 375, 236, 503, 28, 295, 156, 423, 92, 359, 220, 487, 60, 327, 188, 455, 124, 391, 252, 519, 260, 2, 269, 130, 397, 66, 333, 194, 461, 34, 301, 162, 429, 98, 365, 226, 493, 18, 285, 146, 413, 82, 349, 210, 477, 50, 317, 178, 445, 114, 381, 242, 509, 258, 10, 277, 138, 405, 74, 341, 202, 469, 42, 309, 170, 437, 106, 373, 234, 501, 26, 293, 154, 421, 90, 357, 218, 485, 58, 325, 186, 453, 122, 389, 250, 517, 6, 273, 134, 401, 70, 337, 198, 465, 38, 305, 166, 433, 102, 369, 230, 497, 22, 289, 150, 417, 86, 353, 214, 481, 54, 321, 182, 449, 118, 385, 246, 513, 265, 14, 281, 142, 409, 78, 345, 206, 473, 46, 313, 174, 441, 110, 377, 238, 505, 30, 297, 158, 425, 94, 361, 222, 489, 62, 329, 190, 457, 126, 393, 254, 521, 261, 1, 268, 129, 396, 65, 332, 193, 460, 33, 300, 161, 428, 97, 364, 225, 492, 17, 284, 145, 412, 81, 348, 209, 476, 49, 316, 177, 444, 113, 380, 241, 508, 257, 9, 276, 137, 404, 73, 340, 201, 468, 41, 308, 169, 436, 105, 372, 233, 500, 25, 292, 153, 420, 89, 356, 217, 484, 57, 324, 185, 452, 121, 388, 249, 516, 5, 272, 133, 400, 69, 336, 197, 464, 37, 304, 165, 432, 101, 368, 229, 496, 21, 288, 149, 416, 85, 352, 213, 480, 53, 320, 181, 448, 117, 384, 245, 512, 264, 13, 280, 141, 408, 77, 344, 205, 472, 45, 312, 173, 440, 109, 376, 237, 504, 29, 296, 157, 424, 93, 360, 221, 488, 61, 328, 189, 456, 125, 392, 253, 520, 262, 3, 270, 131, 398, 67, 334, 195, 462, 35, 302, 163, 430, 99, 366, 227, 494, 19, 286, 147, 414, 83, 350, 211, 478, 51, 318, 179, 446, 115, 382, 243, 510, 259, 11, 278, 139, 406, 75, 342, 203, 470, 43, 310, 171, 438, 107, 374, 235, 502, 27, 294, 155, 422, 91, 358, 219, 486, 59, 326, 187, 454, 123, 390, 251, 518, 7, 274, 135, 402, 71, 338, 199, 466, 39, 306, 167, 434, 103, 370, 231, 498, 23, 290, 151, 418, 87, 354, 215, 482, 55, 322, 183, 450, 119, 386, 247, 514, 266, 15, 282, 143, 410, 79, 346, 207, 474, 47, 314, 175, 442, 111, 378, 239, 506, 31, 298, 159, 426, 95, 362, 223, 490, 63, 330, 191, 458, 127, 394, 255, 522]; - - return (unsafe{*PERM523.get_unchecked((index % 523) as usize)} as u32 * 273529 + - unsafe{*PERM523.get_unchecked(((index / 523) % 523) as usize)} as u32 * 523 + - unsafe{*PERM523.get_unchecked(((index / 273529) % 523) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (143055667u32 as f32)); // Results in [0,1). -} - - -fn halton541(index: u32) -> f32 { - const PERM541: [u16; 541] = [0, 285, 128, 413, 64, 349, 192, 477, 32, 317, 160, 445, 96, 381, 224, 509, 256, 16, 301, 144, 429, 80, 365, 208, 493, 48, 333, 176, 461, 112, 397, 240, 525, 264, 8, 293, 136, 421, 72, 357, 200, 485, 40, 325, 168, 453, 104, 389, 232, 517, 277, 24, 309, 152, 437, 88, 373, 216, 501, 56, 341, 184, 469, 120, 405, 248, 533, 268, 4, 289, 132, 417, 68, 353, 196, 481, 36, 321, 164, 449, 100, 385, 228, 513, 260, 20, 305, 148, 433, 84, 369, 212, 497, 52, 337, 180, 465, 116, 401, 244, 529, 273, 12, 297, 140, 425, 76, 361, 204, 489, 44, 329, 172, 457, 108, 393, 236, 521, 281, 28, 313, 156, 441, 92, 377, 220, 505, 60, 345, 188, 473, 124, 409, 252, 537, 2, 287, 130, 415, 66, 351, 194, 479, 34, 319, 162, 447, 98, 383, 226, 511, 258, 18, 303, 146, 431, 82, 367, 210, 495, 50, 335, 178, 463, 114, 399, 242, 527, 266, 10, 295, 138, 423, 74, 359, 202, 487, 42, 327, 170, 455, 106, 391, 234, 519, 279, 26, 311, 154, 439, 90, 375, 218, 503, 58, 343, 186, 471, 122, 407, 250, 535, 271, 6, 291, 134, 419, 70, 355, 198, 483, 38, 323, 166, 451, 102, 387, 230, 515, 262, 22, 307, 150, 435, 86, 371, 214, 499, 54, 339, 182, 467, 118, 403, 246, 531, 275, 14, 299, 142, 427, 78, 363, 206, 491, 46, 331, 174, 459, 110, 395, 238, 523, 283, 30, 315, 158, 443, 94, 379, 222, 507, 62, 347, 190, 475, 126, 411, 254, 539, 270, 1, 286, 129, 414, 65, 350, 193, 478, 33, 318, 161, 446, 97, 382, 225, 510, 257, 17, 302, 145, 430, 81, 366, 209, 494, 49, 334, 177, 462, 113, 398, 241, 526, 265, 9, 294, 137, 422, 73, 358, 201, 486, 41, 326, 169, 454, 105, 390, 233, 518, 278, 25, 310, 153, 438, 89, 374, 217, 502, 57, 342, 185, 470, 121, 406, 249, 534, 269, 5, 290, 133, 418, 69, 354, 197, 482, 37, 322, 165, 450, 101, 386, 229, 514, 261, 21, 306, 149, 434, 85, 370, 213, 498, 53, 338, 181, 466, 117, 402, 245, 530, 274, 13, 298, 141, 426, 77, 362, 205, 490, 45, 330, 173, 458, 109, 394, 237, 522, 282, 29, 314, 157, 442, 93, 378, 221, 506, 61, 346, 189, 474, 125, 410, 253, 538, 3, 288, 131, 416, 67, 352, 195, 480, 35, 320, 163, 448, 99, 384, 227, 512, 259, 19, 304, 147, 432, 83, 368, 211, 496, 51, 336, 179, 464, 115, 400, 243, 528, 267, 11, 296, 139, 424, 75, 360, 203, 488, 43, 328, 171, 456, 107, 392, 235, 520, 280, 27, 312, 155, 440, 91, 376, 219, 504, 59, 344, 187, 472, 123, 408, 251, 536, 272, 7, 292, 135, 420, 71, 356, 199, 484, 39, 324, 167, 452, 103, 388, 231, 516, 263, 23, 308, 151, 436, 87, 372, 215, 500, 55, 340, 183, 468, 119, 404, 247, 532, 276, 15, 300, 143, 428, 79, 364, 207, 492, 47, 332, 175, 460, 111, 396, 239, 524, 284, 31, 316, 159, 444, 95, 380, 223, 508, 63, 348, 191, 476, 127, 412, 255, 540]; - - return (unsafe{*PERM541.get_unchecked((index % 541) as usize)} as u32 * 292681 + - unsafe{*PERM541.get_unchecked(((index / 541) % 541) as usize)} as u32 * 541 + - unsafe{*PERM541.get_unchecked(((index / 292681) % 541) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (158340421u32 as f32)); // Results in [0,1). -} - - -fn halton547(index: u32) -> f32 { - const PERM547: [u16; 547] = [0, 291, 128, 419, 64, 355, 192, 483, 256, 32, 323, 160, 451, 96, 387, 224, 515, 16, 307, 144, 435, 80, 371, 208, 499, 275, 48, 339, 176, 467, 112, 403, 240, 531, 8, 299, 136, 427, 72, 363, 200, 491, 264, 40, 331, 168, 459, 104, 395, 232, 523, 24, 315, 152, 443, 88, 379, 216, 507, 283, 56, 347, 184, 475, 120, 411, 248, 539, 4, 295, 132, 423, 68, 359, 196, 487, 260, 36, 327, 164, 455, 100, 391, 228, 519, 20, 311, 148, 439, 84, 375, 212, 503, 279, 52, 343, 180, 471, 116, 407, 244, 535, 12, 303, 140, 431, 76, 367, 204, 495, 268, 44, 335, 172, 463, 108, 399, 236, 527, 28, 319, 156, 447, 92, 383, 220, 511, 287, 60, 351, 188, 479, 124, 415, 252, 543, 272, 2, 293, 130, 421, 66, 357, 194, 485, 258, 34, 325, 162, 453, 98, 389, 226, 517, 18, 309, 146, 437, 82, 373, 210, 501, 277, 50, 341, 178, 469, 114, 405, 242, 533, 10, 301, 138, 429, 74, 365, 202, 493, 266, 42, 333, 170, 461, 106, 397, 234, 525, 26, 317, 154, 445, 90, 381, 218, 509, 285, 58, 349, 186, 477, 122, 413, 250, 541, 6, 297, 134, 425, 70, 361, 198, 489, 262, 38, 329, 166, 457, 102, 393, 230, 521, 22, 313, 150, 441, 86, 377, 214, 505, 281, 54, 345, 182, 473, 118, 409, 246, 537, 14, 305, 142, 433, 78, 369, 206, 497, 270, 46, 337, 174, 465, 110, 401, 238, 529, 30, 321, 158, 449, 94, 385, 222, 513, 289, 62, 353, 190, 481, 126, 417, 254, 545, 273, 1, 292, 129, 420, 65, 356, 193, 484, 257, 33, 324, 161, 452, 97, 388, 225, 516, 17, 308, 145, 436, 81, 372, 209, 500, 276, 49, 340, 177, 468, 113, 404, 241, 532, 9, 300, 137, 428, 73, 364, 201, 492, 265, 41, 332, 169, 460, 105, 396, 233, 524, 25, 316, 153, 444, 89, 380, 217, 508, 284, 57, 348, 185, 476, 121, 412, 249, 540, 5, 296, 133, 424, 69, 360, 197, 488, 261, 37, 328, 165, 456, 101, 392, 229, 520, 21, 312, 149, 440, 85, 376, 213, 504, 280, 53, 344, 181, 472, 117, 408, 245, 536, 13, 304, 141, 432, 77, 368, 205, 496, 269, 45, 336, 173, 464, 109, 400, 237, 528, 29, 320, 157, 448, 93, 384, 221, 512, 288, 61, 352, 189, 480, 125, 416, 253, 544, 274, 3, 294, 131, 422, 67, 358, 195, 486, 259, 35, 326, 163, 454, 99, 390, 227, 518, 19, 310, 147, 438, 83, 374, 211, 502, 278, 51, 342, 179, 470, 115, 406, 243, 534, 11, 302, 139, 430, 75, 366, 203, 494, 267, 43, 334, 171, 462, 107, 398, 235, 526, 27, 318, 155, 446, 91, 382, 219, 510, 286, 59, 350, 187, 478, 123, 414, 251, 542, 7, 298, 135, 426, 71, 362, 199, 490, 263, 39, 330, 167, 458, 103, 394, 231, 522, 23, 314, 151, 442, 87, 378, 215, 506, 282, 55, 346, 183, 474, 119, 410, 247, 538, 15, 306, 143, 434, 79, 370, 207, 498, 271, 47, 338, 175, 466, 111, 402, 239, 530, 31, 322, 159, 450, 95, 386, 223, 514, 290, 63, 354, 191, 482, 127, 418, 255, 546]; - - return (unsafe{*PERM547.get_unchecked((index % 547) as usize)} as u32 * 299209 + - unsafe{*PERM547.get_unchecked(((index / 547) % 547) as usize)} as u32 * 547 + - unsafe{*PERM547.get_unchecked(((index / 299209) % 547) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (163667323u32 as f32)); // Results in [0,1). -} - - -fn halton557(index: u32) -> f32 { - const PERM557: [u16; 557] = [0, 301, 128, 429, 64, 365, 192, 493, 256, 32, 333, 160, 461, 96, 397, 224, 525, 16, 317, 144, 445, 80, 381, 208, 509, 285, 48, 349, 176, 477, 112, 413, 240, 541, 272, 8, 309, 136, 437, 72, 373, 200, 501, 264, 40, 341, 168, 469, 104, 405, 232, 533, 24, 325, 152, 453, 88, 389, 216, 517, 293, 56, 357, 184, 485, 120, 421, 248, 549, 276, 4, 305, 132, 433, 68, 369, 196, 497, 260, 36, 337, 164, 465, 100, 401, 228, 529, 20, 321, 148, 449, 84, 385, 212, 513, 289, 52, 353, 180, 481, 116, 417, 244, 545, 281, 12, 313, 140, 441, 76, 377, 204, 505, 268, 44, 345, 172, 473, 108, 409, 236, 537, 28, 329, 156, 457, 92, 393, 220, 521, 297, 60, 361, 188, 489, 124, 425, 252, 553, 2, 303, 130, 431, 66, 367, 194, 495, 258, 34, 335, 162, 463, 98, 399, 226, 527, 18, 319, 146, 447, 82, 383, 210, 511, 287, 50, 351, 178, 479, 114, 415, 242, 543, 274, 10, 311, 138, 439, 74, 375, 202, 503, 266, 42, 343, 170, 471, 106, 407, 234, 535, 26, 327, 154, 455, 90, 391, 218, 519, 295, 58, 359, 186, 487, 122, 423, 250, 551, 279, 6, 307, 134, 435, 70, 371, 198, 499, 262, 38, 339, 166, 467, 102, 403, 230, 531, 22, 323, 150, 451, 86, 387, 214, 515, 291, 54, 355, 182, 483, 118, 419, 246, 547, 283, 14, 315, 142, 443, 78, 379, 206, 507, 270, 46, 347, 174, 475, 110, 411, 238, 539, 30, 331, 158, 459, 94, 395, 222, 523, 299, 62, 363, 190, 491, 126, 427, 254, 555, 278, 1, 302, 129, 430, 65, 366, 193, 494, 257, 33, 334, 161, 462, 97, 398, 225, 526, 17, 318, 145, 446, 81, 382, 209, 510, 286, 49, 350, 177, 478, 113, 414, 241, 542, 273, 9, 310, 137, 438, 73, 374, 201, 502, 265, 41, 342, 169, 470, 105, 406, 233, 534, 25, 326, 153, 454, 89, 390, 217, 518, 294, 57, 358, 185, 486, 121, 422, 249, 550, 277, 5, 306, 133, 434, 69, 370, 197, 498, 261, 37, 338, 165, 466, 101, 402, 229, 530, 21, 322, 149, 450, 85, 386, 213, 514, 290, 53, 354, 181, 482, 117, 418, 245, 546, 282, 13, 314, 141, 442, 77, 378, 205, 506, 269, 45, 346, 173, 474, 109, 410, 237, 538, 29, 330, 157, 458, 93, 394, 221, 522, 298, 61, 362, 189, 490, 125, 426, 253, 554, 3, 304, 131, 432, 67, 368, 195, 496, 259, 35, 336, 163, 464, 99, 400, 227, 528, 19, 320, 147, 448, 83, 384, 211, 512, 288, 51, 352, 179, 480, 115, 416, 243, 544, 275, 11, 312, 139, 440, 75, 376, 203, 504, 267, 43, 344, 171, 472, 107, 408, 235, 536, 27, 328, 155, 456, 91, 392, 219, 520, 296, 59, 360, 187, 488, 123, 424, 251, 552, 280, 7, 308, 135, 436, 71, 372, 199, 500, 263, 39, 340, 167, 468, 103, 404, 231, 532, 23, 324, 151, 452, 87, 388, 215, 516, 292, 55, 356, 183, 484, 119, 420, 247, 548, 284, 15, 316, 143, 444, 79, 380, 207, 508, 271, 47, 348, 175, 476, 111, 412, 239, 540, 31, 332, 159, 460, 95, 396, 223, 524, 300, 63, 364, 191, 492, 127, 428, 255, 556]; - - return (unsafe{*PERM557.get_unchecked((index % 557) as usize)} as u32 * 310249 + - unsafe{*PERM557.get_unchecked(((index / 557) % 557) as usize)} as u32 * 557 + - unsafe{*PERM557.get_unchecked(((index / 310249) % 557) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (172808693u32 as f32)); // Results in [0,1). -} - - -fn halton563(index: u32) -> f32 { - const PERM563: [u16; 563] = [0, 307, 128, 435, 64, 371, 192, 499, 256, 32, 339, 160, 467, 96, 403, 224, 531, 272, 16, 323, 144, 451, 80, 387, 208, 515, 291, 48, 355, 176, 483, 112, 419, 240, 547, 8, 315, 136, 443, 72, 379, 200, 507, 264, 40, 347, 168, 475, 104, 411, 232, 539, 283, 24, 331, 152, 459, 88, 395, 216, 523, 299, 56, 363, 184, 491, 120, 427, 248, 555, 4, 311, 132, 439, 68, 375, 196, 503, 260, 36, 343, 164, 471, 100, 407, 228, 535, 276, 20, 327, 148, 455, 84, 391, 212, 519, 295, 52, 359, 180, 487, 116, 423, 244, 551, 12, 319, 140, 447, 76, 383, 204, 511, 268, 44, 351, 172, 479, 108, 415, 236, 543, 287, 28, 335, 156, 463, 92, 399, 220, 527, 303, 60, 367, 188, 495, 124, 431, 252, 559, 280, 2, 309, 130, 437, 66, 373, 194, 501, 258, 34, 341, 162, 469, 98, 405, 226, 533, 274, 18, 325, 146, 453, 82, 389, 210, 517, 293, 50, 357, 178, 485, 114, 421, 242, 549, 10, 317, 138, 445, 74, 381, 202, 509, 266, 42, 349, 170, 477, 106, 413, 234, 541, 285, 26, 333, 154, 461, 90, 397, 218, 525, 301, 58, 365, 186, 493, 122, 429, 250, 557, 6, 313, 134, 441, 70, 377, 198, 505, 262, 38, 345, 166, 473, 102, 409, 230, 537, 278, 22, 329, 150, 457, 86, 393, 214, 521, 297, 54, 361, 182, 489, 118, 425, 246, 553, 14, 321, 142, 449, 78, 385, 206, 513, 270, 46, 353, 174, 481, 110, 417, 238, 545, 289, 30, 337, 158, 465, 94, 401, 222, 529, 305, 62, 369, 190, 497, 126, 433, 254, 561, 281, 1, 308, 129, 436, 65, 372, 193, 500, 257, 33, 340, 161, 468, 97, 404, 225, 532, 273, 17, 324, 145, 452, 81, 388, 209, 516, 292, 49, 356, 177, 484, 113, 420, 241, 548, 9, 316, 137, 444, 73, 380, 201, 508, 265, 41, 348, 169, 476, 105, 412, 233, 540, 284, 25, 332, 153, 460, 89, 396, 217, 524, 300, 57, 364, 185, 492, 121, 428, 249, 556, 5, 312, 133, 440, 69, 376, 197, 504, 261, 37, 344, 165, 472, 101, 408, 229, 536, 277, 21, 328, 149, 456, 85, 392, 213, 520, 296, 53, 360, 181, 488, 117, 424, 245, 552, 13, 320, 141, 448, 77, 384, 205, 512, 269, 45, 352, 173, 480, 109, 416, 237, 544, 288, 29, 336, 157, 464, 93, 400, 221, 528, 304, 61, 368, 189, 496, 125, 432, 253, 560, 282, 3, 310, 131, 438, 67, 374, 195, 502, 259, 35, 342, 163, 470, 99, 406, 227, 534, 275, 19, 326, 147, 454, 83, 390, 211, 518, 294, 51, 358, 179, 486, 115, 422, 243, 550, 11, 318, 139, 446, 75, 382, 203, 510, 267, 43, 350, 171, 478, 107, 414, 235, 542, 286, 27, 334, 155, 462, 91, 398, 219, 526, 302, 59, 366, 187, 494, 123, 430, 251, 558, 7, 314, 135, 442, 71, 378, 199, 506, 263, 39, 346, 167, 474, 103, 410, 231, 538, 279, 23, 330, 151, 458, 87, 394, 215, 522, 298, 55, 362, 183, 490, 119, 426, 247, 554, 15, 322, 143, 450, 79, 386, 207, 514, 271, 47, 354, 175, 482, 111, 418, 239, 546, 290, 31, 338, 159, 466, 95, 402, 223, 530, 306, 63, 370, 191, 498, 127, 434, 255, 562]; - - return (unsafe{*PERM563.get_unchecked((index % 563) as usize)} as u32 * 316969 + - unsafe{*PERM563.get_unchecked(((index / 563) % 563) as usize)} as u32 * 563 + - unsafe{*PERM563.get_unchecked(((index / 316969) % 563) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (178453547u32 as f32)); // Results in [0,1). -} - - -fn halton569(index: u32) -> f32 { - const PERM569: [u16; 569] = [0, 313, 128, 441, 64, 377, 192, 505, 256, 32, 345, 160, 473, 96, 409, 224, 537, 272, 16, 329, 144, 457, 80, 393, 208, 521, 297, 48, 361, 176, 489, 112, 425, 240, 553, 280, 8, 321, 136, 449, 72, 385, 200, 513, 264, 40, 353, 168, 481, 104, 417, 232, 545, 289, 24, 337, 152, 465, 88, 401, 216, 529, 305, 56, 369, 184, 497, 120, 433, 248, 561, 4, 317, 132, 445, 68, 381, 196, 509, 260, 36, 349, 164, 477, 100, 413, 228, 541, 276, 20, 333, 148, 461, 84, 397, 212, 525, 301, 52, 365, 180, 493, 116, 429, 244, 557, 285, 12, 325, 140, 453, 76, 389, 204, 517, 268, 44, 357, 172, 485, 108, 421, 236, 549, 293, 28, 341, 156, 469, 92, 405, 220, 533, 309, 60, 373, 188, 501, 124, 437, 252, 565, 2, 315, 130, 443, 66, 379, 194, 507, 258, 34, 347, 162, 475, 98, 411, 226, 539, 274, 18, 331, 146, 459, 82, 395, 210, 523, 299, 50, 363, 178, 491, 114, 427, 242, 555, 282, 10, 323, 138, 451, 74, 387, 202, 515, 266, 42, 355, 170, 483, 106, 419, 234, 547, 291, 26, 339, 154, 467, 90, 403, 218, 531, 307, 58, 371, 186, 499, 122, 435, 250, 563, 6, 319, 134, 447, 70, 383, 198, 511, 262, 38, 351, 166, 479, 102, 415, 230, 543, 278, 22, 335, 150, 463, 86, 399, 214, 527, 303, 54, 367, 182, 495, 118, 431, 246, 559, 287, 14, 327, 142, 455, 78, 391, 206, 519, 270, 46, 359, 174, 487, 110, 423, 238, 551, 295, 30, 343, 158, 471, 94, 407, 222, 535, 311, 62, 375, 190, 503, 126, 439, 254, 567, 284, 1, 314, 129, 442, 65, 378, 193, 506, 257, 33, 346, 161, 474, 97, 410, 225, 538, 273, 17, 330, 145, 458, 81, 394, 209, 522, 298, 49, 362, 177, 490, 113, 426, 241, 554, 281, 9, 322, 137, 450, 73, 386, 201, 514, 265, 41, 354, 169, 482, 105, 418, 233, 546, 290, 25, 338, 153, 466, 89, 402, 217, 530, 306, 57, 370, 185, 498, 121, 434, 249, 562, 5, 318, 133, 446, 69, 382, 197, 510, 261, 37, 350, 165, 478, 101, 414, 229, 542, 277, 21, 334, 149, 462, 85, 398, 213, 526, 302, 53, 366, 181, 494, 117, 430, 245, 558, 286, 13, 326, 141, 454, 77, 390, 205, 518, 269, 45, 358, 173, 486, 109, 422, 237, 550, 294, 29, 342, 157, 470, 93, 406, 221, 534, 310, 61, 374, 189, 502, 125, 438, 253, 566, 3, 316, 131, 444, 67, 380, 195, 508, 259, 35, 348, 163, 476, 99, 412, 227, 540, 275, 19, 332, 147, 460, 83, 396, 211, 524, 300, 51, 364, 179, 492, 115, 428, 243, 556, 283, 11, 324, 139, 452, 75, 388, 203, 516, 267, 43, 356, 171, 484, 107, 420, 235, 548, 292, 27, 340, 155, 468, 91, 404, 219, 532, 308, 59, 372, 187, 500, 123, 436, 251, 564, 7, 320, 135, 448, 71, 384, 199, 512, 263, 39, 352, 167, 480, 103, 416, 231, 544, 279, 23, 336, 151, 464, 87, 400, 215, 528, 304, 55, 368, 183, 496, 119, 432, 247, 560, 288, 15, 328, 143, 456, 79, 392, 207, 520, 271, 47, 360, 175, 488, 111, 424, 239, 552, 296, 31, 344, 159, 472, 95, 408, 223, 536, 312, 63, 376, 191, 504, 127, 440, 255, 568]; - - return (unsafe{*PERM569.get_unchecked((index % 569) as usize)} as u32 * 323761 + - unsafe{*PERM569.get_unchecked(((index / 569) % 569) as usize)} as u32 * 569 + - unsafe{*PERM569.get_unchecked(((index / 323761) % 569) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (184220009u32 as f32)); // Results in [0,1). -} - - -fn halton571(index: u32) -> f32 { - const PERM571: [u16; 571] = [0, 315, 128, 443, 64, 379, 192, 507, 256, 32, 347, 160, 475, 96, 411, 224, 539, 272, 16, 331, 144, 459, 80, 395, 208, 523, 299, 48, 363, 176, 491, 112, 427, 240, 555, 280, 8, 323, 136, 451, 72, 387, 200, 515, 264, 40, 355, 168, 483, 104, 419, 232, 547, 291, 24, 339, 152, 467, 88, 403, 216, 531, 307, 56, 371, 184, 499, 120, 435, 248, 563, 4, 319, 132, 447, 68, 383, 196, 511, 260, 36, 351, 164, 479, 100, 415, 228, 543, 276, 20, 335, 148, 463, 84, 399, 212, 527, 303, 52, 367, 180, 495, 116, 431, 244, 559, 287, 12, 327, 140, 455, 76, 391, 204, 519, 268, 44, 359, 172, 487, 108, 423, 236, 551, 295, 28, 343, 156, 471, 92, 407, 220, 535, 311, 60, 375, 188, 503, 124, 439, 252, 567, 284, 2, 317, 130, 445, 66, 381, 194, 509, 258, 34, 349, 162, 477, 98, 413, 226, 541, 274, 18, 333, 146, 461, 82, 397, 210, 525, 301, 50, 365, 178, 493, 114, 429, 242, 557, 282, 10, 325, 138, 453, 74, 389, 202, 517, 266, 42, 357, 170, 485, 106, 421, 234, 549, 293, 26, 341, 154, 469, 90, 405, 218, 533, 309, 58, 373, 186, 501, 122, 437, 250, 565, 6, 321, 134, 449, 70, 385, 198, 513, 262, 38, 353, 166, 481, 102, 417, 230, 545, 278, 22, 337, 150, 465, 86, 401, 214, 529, 305, 54, 369, 182, 497, 118, 433, 246, 561, 289, 14, 329, 142, 457, 78, 393, 206, 521, 270, 46, 361, 174, 489, 110, 425, 238, 553, 297, 30, 345, 158, 473, 94, 409, 222, 537, 313, 62, 377, 190, 505, 126, 441, 254, 569, 285, 1, 316, 129, 444, 65, 380, 193, 508, 257, 33, 348, 161, 476, 97, 412, 225, 540, 273, 17, 332, 145, 460, 81, 396, 209, 524, 300, 49, 364, 177, 492, 113, 428, 241, 556, 281, 9, 324, 137, 452, 73, 388, 201, 516, 265, 41, 356, 169, 484, 105, 420, 233, 548, 292, 25, 340, 153, 468, 89, 404, 217, 532, 308, 57, 372, 185, 500, 121, 436, 249, 564, 5, 320, 133, 448, 69, 384, 197, 512, 261, 37, 352, 165, 480, 101, 416, 229, 544, 277, 21, 336, 149, 464, 85, 400, 213, 528, 304, 53, 368, 181, 496, 117, 432, 245, 560, 288, 13, 328, 141, 456, 77, 392, 205, 520, 269, 45, 360, 173, 488, 109, 424, 237, 552, 296, 29, 344, 157, 472, 93, 408, 221, 536, 312, 61, 376, 189, 504, 125, 440, 253, 568, 286, 3, 318, 131, 446, 67, 382, 195, 510, 259, 35, 350, 163, 478, 99, 414, 227, 542, 275, 19, 334, 147, 462, 83, 398, 211, 526, 302, 51, 366, 179, 494, 115, 430, 243, 558, 283, 11, 326, 139, 454, 75, 390, 203, 518, 267, 43, 358, 171, 486, 107, 422, 235, 550, 294, 27, 342, 155, 470, 91, 406, 219, 534, 310, 59, 374, 187, 502, 123, 438, 251, 566, 7, 322, 135, 450, 71, 386, 199, 514, 263, 39, 354, 167, 482, 103, 418, 231, 546, 279, 23, 338, 151, 466, 87, 402, 215, 530, 306, 55, 370, 183, 498, 119, 434, 247, 562, 290, 15, 330, 143, 458, 79, 394, 207, 522, 271, 47, 362, 175, 490, 111, 426, 239, 554, 298, 31, 346, 159, 474, 95, 410, 223, 538, 314, 63, 378, 191, 506, 127, 442, 255, 570]; - - return (unsafe{*PERM571.get_unchecked((index % 571) as usize)} as u32 * 326041 + - unsafe{*PERM571.get_unchecked(((index / 571) % 571) as usize)} as u32 * 571 + - unsafe{*PERM571.get_unchecked(((index / 326041) % 571) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (186169411u32 as f32)); // Results in [0,1). -} - - -fn halton577(index: u32) -> f32 { - const PERM577: [u16; 577] = [0, 321, 128, 449, 256, 64, 385, 192, 513, 32, 353, 160, 481, 289, 96, 417, 224, 545, 16, 337, 144, 465, 272, 80, 401, 208, 529, 48, 369, 176, 497, 305, 112, 433, 240, 561, 8, 329, 136, 457, 264, 72, 393, 200, 521, 40, 361, 168, 489, 297, 104, 425, 232, 553, 24, 345, 152, 473, 280, 88, 409, 216, 537, 56, 377, 184, 505, 313, 120, 441, 248, 569, 4, 325, 132, 453, 260, 68, 389, 196, 517, 36, 357, 164, 485, 293, 100, 421, 228, 549, 20, 341, 148, 469, 276, 84, 405, 212, 533, 52, 373, 180, 501, 309, 116, 437, 244, 565, 12, 333, 140, 461, 268, 76, 397, 204, 525, 44, 365, 172, 493, 301, 108, 429, 236, 557, 28, 349, 156, 477, 284, 92, 413, 220, 541, 60, 381, 188, 509, 317, 124, 445, 252, 573, 2, 323, 130, 451, 258, 66, 387, 194, 515, 34, 355, 162, 483, 291, 98, 419, 226, 547, 18, 339, 146, 467, 274, 82, 403, 210, 531, 50, 371, 178, 499, 307, 114, 435, 242, 563, 10, 331, 138, 459, 266, 74, 395, 202, 523, 42, 363, 170, 491, 299, 106, 427, 234, 555, 26, 347, 154, 475, 282, 90, 411, 218, 539, 58, 379, 186, 507, 315, 122, 443, 250, 571, 6, 327, 134, 455, 262, 70, 391, 198, 519, 38, 359, 166, 487, 295, 102, 423, 230, 551, 22, 343, 150, 471, 278, 86, 407, 214, 535, 54, 375, 182, 503, 311, 118, 439, 246, 567, 14, 335, 142, 463, 270, 78, 399, 206, 527, 46, 367, 174, 495, 303, 110, 431, 238, 559, 30, 351, 158, 479, 286, 94, 415, 222, 543, 62, 383, 190, 511, 319, 126, 447, 254, 575, 288, 1, 322, 129, 450, 257, 65, 386, 193, 514, 33, 354, 161, 482, 290, 97, 418, 225, 546, 17, 338, 145, 466, 273, 81, 402, 209, 530, 49, 370, 177, 498, 306, 113, 434, 241, 562, 9, 330, 137, 458, 265, 73, 394, 201, 522, 41, 362, 169, 490, 298, 105, 426, 233, 554, 25, 346, 153, 474, 281, 89, 410, 217, 538, 57, 378, 185, 506, 314, 121, 442, 249, 570, 5, 326, 133, 454, 261, 69, 390, 197, 518, 37, 358, 165, 486, 294, 101, 422, 229, 550, 21, 342, 149, 470, 277, 85, 406, 213, 534, 53, 374, 181, 502, 310, 117, 438, 245, 566, 13, 334, 141, 462, 269, 77, 398, 205, 526, 45, 366, 173, 494, 302, 109, 430, 237, 558, 29, 350, 157, 478, 285, 93, 414, 221, 542, 61, 382, 189, 510, 318, 125, 446, 253, 574, 3, 324, 131, 452, 259, 67, 388, 195, 516, 35, 356, 163, 484, 292, 99, 420, 227, 548, 19, 340, 147, 468, 275, 83, 404, 211, 532, 51, 372, 179, 500, 308, 115, 436, 243, 564, 11, 332, 139, 460, 267, 75, 396, 203, 524, 43, 364, 171, 492, 300, 107, 428, 235, 556, 27, 348, 155, 476, 283, 91, 412, 219, 540, 59, 380, 187, 508, 316, 123, 444, 251, 572, 7, 328, 135, 456, 263, 71, 392, 199, 520, 39, 360, 167, 488, 296, 103, 424, 231, 552, 23, 344, 151, 472, 279, 87, 408, 215, 536, 55, 376, 183, 504, 312, 119, 440, 247, 568, 15, 336, 143, 464, 271, 79, 400, 207, 528, 47, 368, 175, 496, 304, 111, 432, 239, 560, 31, 352, 159, 480, 287, 95, 416, 223, 544, 63, 384, 191, 512, 320, 127, 448, 255, 576]; - - return (unsafe{*PERM577.get_unchecked((index % 577) as usize)} as u32 * 332929 + - unsafe{*PERM577.get_unchecked(((index / 577) % 577) as usize)} as u32 * 577 + - unsafe{*PERM577.get_unchecked(((index / 332929) % 577) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (192100033u32 as f32)); // Results in [0,1). -} - - -fn halton587(index: u32) -> f32 { - const PERM587: [u16; 587] = [0, 331, 128, 459, 256, 64, 395, 192, 523, 32, 363, 160, 491, 299, 96, 427, 224, 555, 16, 347, 144, 475, 272, 80, 411, 208, 539, 48, 379, 176, 507, 315, 112, 443, 240, 571, 288, 8, 339, 136, 467, 264, 72, 403, 200, 531, 40, 371, 168, 499, 307, 104, 435, 232, 563, 24, 355, 152, 483, 280, 88, 419, 216, 547, 56, 387, 184, 515, 323, 120, 451, 248, 579, 4, 335, 132, 463, 260, 68, 399, 196, 527, 36, 367, 164, 495, 303, 100, 431, 228, 559, 20, 351, 148, 479, 276, 84, 415, 212, 543, 52, 383, 180, 511, 319, 116, 447, 244, 575, 295, 12, 343, 140, 471, 268, 76, 407, 204, 535, 44, 375, 172, 503, 311, 108, 439, 236, 567, 28, 359, 156, 487, 284, 92, 423, 220, 551, 60, 391, 188, 519, 327, 124, 455, 252, 583, 292, 2, 333, 130, 461, 258, 66, 397, 194, 525, 34, 365, 162, 493, 301, 98, 429, 226, 557, 18, 349, 146, 477, 274, 82, 413, 210, 541, 50, 381, 178, 509, 317, 114, 445, 242, 573, 290, 10, 341, 138, 469, 266, 74, 405, 202, 533, 42, 373, 170, 501, 309, 106, 437, 234, 565, 26, 357, 154, 485, 282, 90, 421, 218, 549, 58, 389, 186, 517, 325, 122, 453, 250, 581, 6, 337, 134, 465, 262, 70, 401, 198, 529, 38, 369, 166, 497, 305, 102, 433, 230, 561, 22, 353, 150, 481, 278, 86, 417, 214, 545, 54, 385, 182, 513, 321, 118, 449, 246, 577, 297, 14, 345, 142, 473, 270, 78, 409, 206, 537, 46, 377, 174, 505, 313, 110, 441, 238, 569, 30, 361, 158, 489, 286, 94, 425, 222, 553, 62, 393, 190, 521, 329, 126, 457, 254, 585, 293, 1, 332, 129, 460, 257, 65, 396, 193, 524, 33, 364, 161, 492, 300, 97, 428, 225, 556, 17, 348, 145, 476, 273, 81, 412, 209, 540, 49, 380, 177, 508, 316, 113, 444, 241, 572, 289, 9, 340, 137, 468, 265, 73, 404, 201, 532, 41, 372, 169, 500, 308, 105, 436, 233, 564, 25, 356, 153, 484, 281, 89, 420, 217, 548, 57, 388, 185, 516, 324, 121, 452, 249, 580, 5, 336, 133, 464, 261, 69, 400, 197, 528, 37, 368, 165, 496, 304, 101, 432, 229, 560, 21, 352, 149, 480, 277, 85, 416, 213, 544, 53, 384, 181, 512, 320, 117, 448, 245, 576, 296, 13, 344, 141, 472, 269, 77, 408, 205, 536, 45, 376, 173, 504, 312, 109, 440, 237, 568, 29, 360, 157, 488, 285, 93, 424, 221, 552, 61, 392, 189, 520, 328, 125, 456, 253, 584, 294, 3, 334, 131, 462, 259, 67, 398, 195, 526, 35, 366, 163, 494, 302, 99, 430, 227, 558, 19, 350, 147, 478, 275, 83, 414, 211, 542, 51, 382, 179, 510, 318, 115, 446, 243, 574, 291, 11, 342, 139, 470, 267, 75, 406, 203, 534, 43, 374, 171, 502, 310, 107, 438, 235, 566, 27, 358, 155, 486, 283, 91, 422, 219, 550, 59, 390, 187, 518, 326, 123, 454, 251, 582, 7, 338, 135, 466, 263, 71, 402, 199, 530, 39, 370, 167, 498, 306, 103, 434, 231, 562, 23, 354, 151, 482, 279, 87, 418, 215, 546, 55, 386, 183, 514, 322, 119, 450, 247, 578, 298, 15, 346, 143, 474, 271, 79, 410, 207, 538, 47, 378, 175, 506, 314, 111, 442, 239, 570, 31, 362, 159, 490, 287, 95, 426, 223, 554, 63, 394, 191, 522, 330, 127, 458, 255, 586]; - - return (unsafe{*PERM587.get_unchecked((index % 587) as usize)} as u32 * 344569 + - unsafe{*PERM587.get_unchecked(((index / 587) % 587) as usize)} as u32 * 587 + - unsafe{*PERM587.get_unchecked(((index / 344569) % 587) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (202262003u32 as f32)); // Results in [0,1). -} - - -fn halton593(index: u32) -> f32 { - const PERM593: [u16; 593] = [0, 337, 128, 465, 256, 64, 401, 192, 529, 32, 369, 160, 497, 305, 96, 433, 224, 561, 288, 16, 353, 144, 481, 272, 80, 417, 208, 545, 48, 385, 176, 513, 321, 112, 449, 240, 577, 8, 345, 136, 473, 264, 72, 409, 200, 537, 40, 377, 168, 505, 313, 104, 441, 232, 569, 297, 24, 361, 152, 489, 280, 88, 425, 216, 553, 56, 393, 184, 521, 329, 120, 457, 248, 585, 4, 341, 132, 469, 260, 68, 405, 196, 533, 36, 373, 164, 501, 309, 100, 437, 228, 565, 292, 20, 357, 148, 485, 276, 84, 421, 212, 549, 52, 389, 180, 517, 325, 116, 453, 244, 581, 12, 349, 140, 477, 268, 76, 413, 204, 541, 44, 381, 172, 509, 317, 108, 445, 236, 573, 301, 28, 365, 156, 493, 284, 92, 429, 220, 557, 60, 397, 188, 525, 333, 124, 461, 252, 589, 2, 339, 130, 467, 258, 66, 403, 194, 531, 34, 371, 162, 499, 307, 98, 435, 226, 563, 290, 18, 355, 146, 483, 274, 82, 419, 210, 547, 50, 387, 178, 515, 323, 114, 451, 242, 579, 10, 347, 138, 475, 266, 74, 411, 202, 539, 42, 379, 170, 507, 315, 106, 443, 234, 571, 299, 26, 363, 154, 491, 282, 90, 427, 218, 555, 58, 395, 186, 523, 331, 122, 459, 250, 587, 6, 343, 134, 471, 262, 70, 407, 198, 535, 38, 375, 166, 503, 311, 102, 439, 230, 567, 294, 22, 359, 150, 487, 278, 86, 423, 214, 551, 54, 391, 182, 519, 327, 118, 455, 246, 583, 14, 351, 142, 479, 270, 78, 415, 206, 543, 46, 383, 174, 511, 319, 110, 447, 238, 575, 303, 30, 367, 158, 495, 286, 94, 431, 222, 559, 62, 399, 190, 527, 335, 126, 463, 254, 591, 296, 1, 338, 129, 466, 257, 65, 402, 193, 530, 33, 370, 161, 498, 306, 97, 434, 225, 562, 289, 17, 354, 145, 482, 273, 81, 418, 209, 546, 49, 386, 177, 514, 322, 113, 450, 241, 578, 9, 346, 137, 474, 265, 73, 410, 201, 538, 41, 378, 169, 506, 314, 105, 442, 233, 570, 298, 25, 362, 153, 490, 281, 89, 426, 217, 554, 57, 394, 185, 522, 330, 121, 458, 249, 586, 5, 342, 133, 470, 261, 69, 406, 197, 534, 37, 374, 165, 502, 310, 101, 438, 229, 566, 293, 21, 358, 149, 486, 277, 85, 422, 213, 550, 53, 390, 181, 518, 326, 117, 454, 245, 582, 13, 350, 141, 478, 269, 77, 414, 205, 542, 45, 382, 173, 510, 318, 109, 446, 237, 574, 302, 29, 366, 157, 494, 285, 93, 430, 221, 558, 61, 398, 189, 526, 334, 125, 462, 253, 590, 3, 340, 131, 468, 259, 67, 404, 195, 532, 35, 372, 163, 500, 308, 99, 436, 227, 564, 291, 19, 356, 147, 484, 275, 83, 420, 211, 548, 51, 388, 179, 516, 324, 115, 452, 243, 580, 11, 348, 139, 476, 267, 75, 412, 203, 540, 43, 380, 171, 508, 316, 107, 444, 235, 572, 300, 27, 364, 155, 492, 283, 91, 428, 219, 556, 59, 396, 187, 524, 332, 123, 460, 251, 588, 7, 344, 135, 472, 263, 71, 408, 199, 536, 39, 376, 167, 504, 312, 103, 440, 231, 568, 295, 23, 360, 151, 488, 279, 87, 424, 215, 552, 55, 392, 183, 520, 328, 119, 456, 247, 584, 15, 352, 143, 480, 271, 79, 416, 207, 544, 47, 384, 175, 512, 320, 111, 448, 239, 576, 304, 31, 368, 159, 496, 287, 95, 432, 223, 560, 63, 400, 191, 528, 336, 127, 464, 255, 592]; - - return (unsafe{*PERM593.get_unchecked((index % 593) as usize)} as u32 * 351649 + - unsafe{*PERM593.get_unchecked(((index / 593) % 593) as usize)} as u32 * 593 + - unsafe{*PERM593.get_unchecked(((index / 351649) % 593) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (208527857u32 as f32)); // Results in [0,1). -} - - -fn halton599(index: u32) -> f32 { - const PERM599: [u16; 599] = [0, 343, 128, 471, 256, 64, 407, 192, 535, 32, 375, 160, 503, 311, 96, 439, 224, 567, 288, 16, 359, 144, 487, 272, 80, 423, 208, 551, 48, 391, 176, 519, 327, 112, 455, 240, 583, 8, 351, 136, 479, 264, 72, 415, 200, 543, 40, 383, 168, 511, 319, 104, 447, 232, 575, 303, 24, 367, 152, 495, 280, 88, 431, 216, 559, 56, 399, 184, 527, 335, 120, 463, 248, 591, 296, 4, 347, 132, 475, 260, 68, 411, 196, 539, 36, 379, 164, 507, 315, 100, 443, 228, 571, 292, 20, 363, 148, 491, 276, 84, 427, 212, 555, 52, 395, 180, 523, 331, 116, 459, 244, 587, 12, 355, 140, 483, 268, 76, 419, 204, 547, 44, 387, 172, 515, 323, 108, 451, 236, 579, 307, 28, 371, 156, 499, 284, 92, 435, 220, 563, 60, 403, 188, 531, 339, 124, 467, 252, 595, 298, 2, 345, 130, 473, 258, 66, 409, 194, 537, 34, 377, 162, 505, 313, 98, 441, 226, 569, 290, 18, 361, 146, 489, 274, 82, 425, 210, 553, 50, 393, 178, 521, 329, 114, 457, 242, 585, 10, 353, 138, 481, 266, 74, 417, 202, 545, 42, 385, 170, 513, 321, 106, 449, 234, 577, 305, 26, 369, 154, 497, 282, 90, 433, 218, 561, 58, 401, 186, 529, 337, 122, 465, 250, 593, 301, 6, 349, 134, 477, 262, 70, 413, 198, 541, 38, 381, 166, 509, 317, 102, 445, 230, 573, 294, 22, 365, 150, 493, 278, 86, 429, 214, 557, 54, 397, 182, 525, 333, 118, 461, 246, 589, 14, 357, 142, 485, 270, 78, 421, 206, 549, 46, 389, 174, 517, 325, 110, 453, 238, 581, 309, 30, 373, 158, 501, 286, 94, 437, 222, 565, 62, 405, 190, 533, 341, 126, 469, 254, 597, 299, 1, 344, 129, 472, 257, 65, 408, 193, 536, 33, 376, 161, 504, 312, 97, 440, 225, 568, 289, 17, 360, 145, 488, 273, 81, 424, 209, 552, 49, 392, 177, 520, 328, 113, 456, 241, 584, 9, 352, 137, 480, 265, 73, 416, 201, 544, 41, 384, 169, 512, 320, 105, 448, 233, 576, 304, 25, 368, 153, 496, 281, 89, 432, 217, 560, 57, 400, 185, 528, 336, 121, 464, 249, 592, 297, 5, 348, 133, 476, 261, 69, 412, 197, 540, 37, 380, 165, 508, 316, 101, 444, 229, 572, 293, 21, 364, 149, 492, 277, 85, 428, 213, 556, 53, 396, 181, 524, 332, 117, 460, 245, 588, 13, 356, 141, 484, 269, 77, 420, 205, 548, 45, 388, 173, 516, 324, 109, 452, 237, 580, 308, 29, 372, 157, 500, 285, 93, 436, 221, 564, 61, 404, 189, 532, 340, 125, 468, 253, 596, 300, 3, 346, 131, 474, 259, 67, 410, 195, 538, 35, 378, 163, 506, 314, 99, 442, 227, 570, 291, 19, 362, 147, 490, 275, 83, 426, 211, 554, 51, 394, 179, 522, 330, 115, 458, 243, 586, 11, 354, 139, 482, 267, 75, 418, 203, 546, 43, 386, 171, 514, 322, 107, 450, 235, 578, 306, 27, 370, 155, 498, 283, 91, 434, 219, 562, 59, 402, 187, 530, 338, 123, 466, 251, 594, 302, 7, 350, 135, 478, 263, 71, 414, 199, 542, 39, 382, 167, 510, 318, 103, 446, 231, 574, 295, 23, 366, 151, 494, 279, 87, 430, 215, 558, 55, 398, 183, 526, 334, 119, 462, 247, 590, 15, 358, 143, 486, 271, 79, 422, 207, 550, 47, 390, 175, 518, 326, 111, 454, 239, 582, 310, 31, 374, 159, 502, 287, 95, 438, 223, 566, 63, 406, 191, 534, 342, 127, 470, 255, 598]; - - return (unsafe{*PERM599.get_unchecked((index % 599) as usize)} as u32 * 358801 + - unsafe{*PERM599.get_unchecked(((index / 599) % 599) as usize)} as u32 * 599 + - unsafe{*PERM599.get_unchecked(((index / 358801) % 599) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (214921799u32 as f32)); // Results in [0,1). -} - - -fn halton601(index: u32) -> f32 { - const PERM601: [u16; 601] = [0, 345, 128, 473, 256, 64, 409, 192, 537, 32, 377, 160, 505, 313, 96, 441, 224, 569, 288, 16, 361, 144, 489, 272, 80, 425, 208, 553, 48, 393, 176, 521, 329, 112, 457, 240, 585, 296, 8, 353, 136, 481, 264, 72, 417, 200, 545, 40, 385, 168, 513, 321, 104, 449, 232, 577, 305, 24, 369, 152, 497, 280, 88, 433, 216, 561, 56, 401, 184, 529, 337, 120, 465, 248, 593, 4, 349, 132, 477, 260, 68, 413, 196, 541, 36, 381, 164, 509, 317, 100, 445, 228, 573, 292, 20, 365, 148, 493, 276, 84, 429, 212, 557, 52, 397, 180, 525, 333, 116, 461, 244, 589, 301, 12, 357, 140, 485, 268, 76, 421, 204, 549, 44, 389, 172, 517, 325, 108, 453, 236, 581, 309, 28, 373, 156, 501, 284, 92, 437, 220, 565, 60, 405, 188, 533, 341, 124, 469, 252, 597, 2, 347, 130, 475, 258, 66, 411, 194, 539, 34, 379, 162, 507, 315, 98, 443, 226, 571, 290, 18, 363, 146, 491, 274, 82, 427, 210, 555, 50, 395, 178, 523, 331, 114, 459, 242, 587, 298, 10, 355, 138, 483, 266, 74, 419, 202, 547, 42, 387, 170, 515, 323, 106, 451, 234, 579, 307, 26, 371, 154, 499, 282, 90, 435, 218, 563, 58, 403, 186, 531, 339, 122, 467, 250, 595, 6, 351, 134, 479, 262, 70, 415, 198, 543, 38, 383, 166, 511, 319, 102, 447, 230, 575, 294, 22, 367, 150, 495, 278, 86, 431, 214, 559, 54, 399, 182, 527, 335, 118, 463, 246, 591, 303, 14, 359, 142, 487, 270, 78, 423, 206, 551, 46, 391, 174, 519, 327, 110, 455, 238, 583, 311, 30, 375, 158, 503, 286, 94, 439, 222, 567, 62, 407, 190, 535, 343, 126, 471, 254, 599, 300, 1, 346, 129, 474, 257, 65, 410, 193, 538, 33, 378, 161, 506, 314, 97, 442, 225, 570, 289, 17, 362, 145, 490, 273, 81, 426, 209, 554, 49, 394, 177, 522, 330, 113, 458, 241, 586, 297, 9, 354, 137, 482, 265, 73, 418, 201, 546, 41, 386, 169, 514, 322, 105, 450, 233, 578, 306, 25, 370, 153, 498, 281, 89, 434, 217, 562, 57, 402, 185, 530, 338, 121, 466, 249, 594, 5, 350, 133, 478, 261, 69, 414, 197, 542, 37, 382, 165, 510, 318, 101, 446, 229, 574, 293, 21, 366, 149, 494, 277, 85, 430, 213, 558, 53, 398, 181, 526, 334, 117, 462, 245, 590, 302, 13, 358, 141, 486, 269, 77, 422, 205, 550, 45, 390, 173, 518, 326, 109, 454, 237, 582, 310, 29, 374, 157, 502, 285, 93, 438, 221, 566, 61, 406, 189, 534, 342, 125, 470, 253, 598, 3, 348, 131, 476, 259, 67, 412, 195, 540, 35, 380, 163, 508, 316, 99, 444, 227, 572, 291, 19, 364, 147, 492, 275, 83, 428, 211, 556, 51, 396, 179, 524, 332, 115, 460, 243, 588, 299, 11, 356, 139, 484, 267, 75, 420, 203, 548, 43, 388, 171, 516, 324, 107, 452, 235, 580, 308, 27, 372, 155, 500, 283, 91, 436, 219, 564, 59, 404, 187, 532, 340, 123, 468, 251, 596, 7, 352, 135, 480, 263, 71, 416, 199, 544, 39, 384, 167, 512, 320, 103, 448, 231, 576, 295, 23, 368, 151, 496, 279, 87, 432, 215, 560, 55, 400, 183, 528, 336, 119, 464, 247, 592, 304, 15, 360, 143, 488, 271, 79, 424, 207, 552, 47, 392, 175, 520, 328, 111, 456, 239, 584, 312, 31, 376, 159, 504, 287, 95, 440, 223, 568, 63, 408, 191, 536, 344, 127, 472, 255, 600]; - - return (unsafe{*PERM601.get_unchecked((index % 601) as usize)} as u32 * 361201 + - unsafe{*PERM601.get_unchecked(((index / 601) % 601) as usize)} as u32 * 601 + - unsafe{*PERM601.get_unchecked(((index / 361201) % 601) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (217081801u32 as f32)); // Results in [0,1). -} - - -fn halton607(index: u32) -> f32 { - const PERM607: [u16; 607] = [0, 351, 128, 479, 256, 64, 415, 192, 543, 32, 383, 160, 511, 319, 96, 447, 224, 575, 288, 16, 367, 144, 495, 272, 80, 431, 208, 559, 48, 399, 176, 527, 335, 112, 463, 240, 591, 296, 8, 359, 136, 487, 264, 72, 423, 200, 551, 40, 391, 168, 519, 327, 104, 455, 232, 583, 311, 24, 375, 152, 503, 280, 88, 439, 216, 567, 56, 407, 184, 535, 343, 120, 471, 248, 599, 300, 4, 355, 132, 483, 260, 68, 419, 196, 547, 36, 387, 164, 515, 323, 100, 451, 228, 579, 292, 20, 371, 148, 499, 276, 84, 435, 212, 563, 52, 403, 180, 531, 339, 116, 467, 244, 595, 307, 12, 363, 140, 491, 268, 76, 427, 204, 555, 44, 395, 172, 523, 331, 108, 459, 236, 587, 315, 28, 379, 156, 507, 284, 92, 443, 220, 571, 60, 411, 188, 539, 347, 124, 475, 252, 603, 302, 2, 353, 130, 481, 258, 66, 417, 194, 545, 34, 385, 162, 513, 321, 98, 449, 226, 577, 290, 18, 369, 146, 497, 274, 82, 433, 210, 561, 50, 401, 178, 529, 337, 114, 465, 242, 593, 298, 10, 361, 138, 489, 266, 74, 425, 202, 553, 42, 393, 170, 521, 329, 106, 457, 234, 585, 313, 26, 377, 154, 505, 282, 90, 441, 218, 569, 58, 409, 186, 537, 345, 122, 473, 250, 601, 305, 6, 357, 134, 485, 262, 70, 421, 198, 549, 38, 389, 166, 517, 325, 102, 453, 230, 581, 294, 22, 373, 150, 501, 278, 86, 437, 214, 565, 54, 405, 182, 533, 341, 118, 469, 246, 597, 309, 14, 365, 142, 493, 270, 78, 429, 206, 557, 46, 397, 174, 525, 333, 110, 461, 238, 589, 317, 30, 381, 158, 509, 286, 94, 445, 222, 573, 62, 413, 190, 541, 349, 126, 477, 254, 605, 303, 1, 352, 129, 480, 257, 65, 416, 193, 544, 33, 384, 161, 512, 320, 97, 448, 225, 576, 289, 17, 368, 145, 496, 273, 81, 432, 209, 560, 49, 400, 177, 528, 336, 113, 464, 241, 592, 297, 9, 360, 137, 488, 265, 73, 424, 201, 552, 41, 392, 169, 520, 328, 105, 456, 233, 584, 312, 25, 376, 153, 504, 281, 89, 440, 217, 568, 57, 408, 185, 536, 344, 121, 472, 249, 600, 301, 5, 356, 133, 484, 261, 69, 420, 197, 548, 37, 388, 165, 516, 324, 101, 452, 229, 580, 293, 21, 372, 149, 500, 277, 85, 436, 213, 564, 53, 404, 181, 532, 340, 117, 468, 245, 596, 308, 13, 364, 141, 492, 269, 77, 428, 205, 556, 45, 396, 173, 524, 332, 109, 460, 237, 588, 316, 29, 380, 157, 508, 285, 93, 444, 221, 572, 61, 412, 189, 540, 348, 125, 476, 253, 604, 304, 3, 354, 131, 482, 259, 67, 418, 195, 546, 35, 386, 163, 514, 322, 99, 450, 227, 578, 291, 19, 370, 147, 498, 275, 83, 434, 211, 562, 51, 402, 179, 530, 338, 115, 466, 243, 594, 299, 11, 362, 139, 490, 267, 75, 426, 203, 554, 43, 394, 171, 522, 330, 107, 458, 235, 586, 314, 27, 378, 155, 506, 283, 91, 442, 219, 570, 59, 410, 187, 538, 346, 123, 474, 251, 602, 306, 7, 358, 135, 486, 263, 71, 422, 199, 550, 39, 390, 167, 518, 326, 103, 454, 231, 582, 295, 23, 374, 151, 502, 279, 87, 438, 215, 566, 55, 406, 183, 534, 342, 119, 470, 247, 598, 310, 15, 366, 143, 494, 271, 79, 430, 207, 558, 47, 398, 175, 526, 334, 111, 462, 239, 590, 318, 31, 382, 159, 510, 287, 95, 446, 223, 574, 63, 414, 191, 542, 350, 127, 478, 255, 606]; - - return (unsafe{*PERM607.get_unchecked((index % 607) as usize)} as u32 * 368449 + - unsafe{*PERM607.get_unchecked(((index / 607) % 607) as usize)} as u32 * 607 + - unsafe{*PERM607.get_unchecked(((index / 368449) % 607) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (223648543u32 as f32)); // Results in [0,1). -} - - -fn halton613(index: u32) -> f32 { - const PERM613: [u16; 613] = [0, 357, 128, 485, 256, 64, 421, 192, 549, 288, 32, 389, 160, 517, 325, 96, 453, 224, 581, 16, 373, 144, 501, 272, 80, 437, 208, 565, 309, 48, 405, 176, 533, 341, 112, 469, 240, 597, 8, 365, 136, 493, 264, 72, 429, 200, 557, 296, 40, 397, 168, 525, 333, 104, 461, 232, 589, 24, 381, 152, 509, 280, 88, 445, 216, 573, 317, 56, 413, 184, 541, 349, 120, 477, 248, 605, 304, 4, 361, 132, 489, 260, 68, 425, 196, 553, 292, 36, 393, 164, 521, 329, 100, 457, 228, 585, 20, 377, 148, 505, 276, 84, 441, 212, 569, 313, 52, 409, 180, 537, 345, 116, 473, 244, 601, 12, 369, 140, 497, 268, 76, 433, 204, 561, 300, 44, 401, 172, 529, 337, 108, 465, 236, 593, 28, 385, 156, 513, 284, 92, 449, 220, 577, 321, 60, 417, 188, 545, 353, 124, 481, 252, 609, 2, 359, 130, 487, 258, 66, 423, 194, 551, 290, 34, 391, 162, 519, 327, 98, 455, 226, 583, 18, 375, 146, 503, 274, 82, 439, 210, 567, 311, 50, 407, 178, 535, 343, 114, 471, 242, 599, 10, 367, 138, 495, 266, 74, 431, 202, 559, 298, 42, 399, 170, 527, 335, 106, 463, 234, 591, 26, 383, 154, 511, 282, 90, 447, 218, 575, 319, 58, 415, 186, 543, 351, 122, 479, 250, 607, 307, 6, 363, 134, 491, 262, 70, 427, 198, 555, 294, 38, 395, 166, 523, 331, 102, 459, 230, 587, 22, 379, 150, 507, 278, 86, 443, 214, 571, 315, 54, 411, 182, 539, 347, 118, 475, 246, 603, 14, 371, 142, 499, 270, 78, 435, 206, 563, 302, 46, 403, 174, 531, 339, 110, 467, 238, 595, 30, 387, 158, 515, 286, 94, 451, 222, 579, 323, 62, 419, 190, 547, 355, 126, 483, 254, 611, 306, 1, 358, 129, 486, 257, 65, 422, 193, 550, 289, 33, 390, 161, 518, 326, 97, 454, 225, 582, 17, 374, 145, 502, 273, 81, 438, 209, 566, 310, 49, 406, 177, 534, 342, 113, 470, 241, 598, 9, 366, 137, 494, 265, 73, 430, 201, 558, 297, 41, 398, 169, 526, 334, 105, 462, 233, 590, 25, 382, 153, 510, 281, 89, 446, 217, 574, 318, 57, 414, 185, 542, 350, 121, 478, 249, 606, 305, 5, 362, 133, 490, 261, 69, 426, 197, 554, 293, 37, 394, 165, 522, 330, 101, 458, 229, 586, 21, 378, 149, 506, 277, 85, 442, 213, 570, 314, 53, 410, 181, 538, 346, 117, 474, 245, 602, 13, 370, 141, 498, 269, 77, 434, 205, 562, 301, 45, 402, 173, 530, 338, 109, 466, 237, 594, 29, 386, 157, 514, 285, 93, 450, 221, 578, 322, 61, 418, 189, 546, 354, 125, 482, 253, 610, 3, 360, 131, 488, 259, 67, 424, 195, 552, 291, 35, 392, 163, 520, 328, 99, 456, 227, 584, 19, 376, 147, 504, 275, 83, 440, 211, 568, 312, 51, 408, 179, 536, 344, 115, 472, 243, 600, 11, 368, 139, 496, 267, 75, 432, 203, 560, 299, 43, 400, 171, 528, 336, 107, 464, 235, 592, 27, 384, 155, 512, 283, 91, 448, 219, 576, 320, 59, 416, 187, 544, 352, 123, 480, 251, 608, 308, 7, 364, 135, 492, 263, 71, 428, 199, 556, 295, 39, 396, 167, 524, 332, 103, 460, 231, 588, 23, 380, 151, 508, 279, 87, 444, 215, 572, 316, 55, 412, 183, 540, 348, 119, 476, 247, 604, 15, 372, 143, 500, 271, 79, 436, 207, 564, 303, 47, 404, 175, 532, 340, 111, 468, 239, 596, 31, 388, 159, 516, 287, 95, 452, 223, 580, 324, 63, 420, 191, 548, 356, 127, 484, 255, 612]; - - return (unsafe{*PERM613.get_unchecked((index % 613) as usize)} as u32 * 375769 + - unsafe{*PERM613.get_unchecked(((index / 613) % 613) as usize)} as u32 * 613 + - unsafe{*PERM613.get_unchecked(((index / 375769) % 613) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (230346397u32 as f32)); // Results in [0,1). -} - - -fn halton617(index: u32) -> f32 { - const PERM617: [u16; 617] = [0, 361, 128, 489, 256, 64, 425, 192, 553, 288, 32, 393, 160, 521, 329, 96, 457, 224, 585, 16, 377, 144, 505, 272, 80, 441, 208, 569, 313, 48, 409, 176, 537, 345, 112, 473, 240, 601, 304, 8, 369, 136, 497, 264, 72, 433, 200, 561, 296, 40, 401, 168, 529, 337, 104, 465, 232, 593, 24, 385, 152, 513, 280, 88, 449, 216, 577, 321, 56, 417, 184, 545, 353, 120, 481, 248, 609, 4, 365, 132, 493, 260, 68, 429, 196, 557, 292, 36, 397, 164, 525, 333, 100, 461, 228, 589, 20, 381, 148, 509, 276, 84, 445, 212, 573, 317, 52, 413, 180, 541, 349, 116, 477, 244, 605, 309, 12, 373, 140, 501, 268, 76, 437, 204, 565, 300, 44, 405, 172, 533, 341, 108, 469, 236, 597, 28, 389, 156, 517, 284, 92, 453, 220, 581, 325, 60, 421, 188, 549, 357, 124, 485, 252, 613, 2, 363, 130, 491, 258, 66, 427, 194, 555, 290, 34, 395, 162, 523, 331, 98, 459, 226, 587, 18, 379, 146, 507, 274, 82, 443, 210, 571, 315, 50, 411, 178, 539, 347, 114, 475, 242, 603, 306, 10, 371, 138, 499, 266, 74, 435, 202, 563, 298, 42, 403, 170, 531, 339, 106, 467, 234, 595, 26, 387, 154, 515, 282, 90, 451, 218, 579, 323, 58, 419, 186, 547, 355, 122, 483, 250, 611, 6, 367, 134, 495, 262, 70, 431, 198, 559, 294, 38, 399, 166, 527, 335, 102, 463, 230, 591, 22, 383, 150, 511, 278, 86, 447, 214, 575, 319, 54, 415, 182, 543, 351, 118, 479, 246, 607, 311, 14, 375, 142, 503, 270, 78, 439, 206, 567, 302, 46, 407, 174, 535, 343, 110, 471, 238, 599, 30, 391, 158, 519, 286, 94, 455, 222, 583, 327, 62, 423, 190, 551, 359, 126, 487, 254, 615, 308, 1, 362, 129, 490, 257, 65, 426, 193, 554, 289, 33, 394, 161, 522, 330, 97, 458, 225, 586, 17, 378, 145, 506, 273, 81, 442, 209, 570, 314, 49, 410, 177, 538, 346, 113, 474, 241, 602, 305, 9, 370, 137, 498, 265, 73, 434, 201, 562, 297, 41, 402, 169, 530, 338, 105, 466, 233, 594, 25, 386, 153, 514, 281, 89, 450, 217, 578, 322, 57, 418, 185, 546, 354, 121, 482, 249, 610, 5, 366, 133, 494, 261, 69, 430, 197, 558, 293, 37, 398, 165, 526, 334, 101, 462, 229, 590, 21, 382, 149, 510, 277, 85, 446, 213, 574, 318, 53, 414, 181, 542, 350, 117, 478, 245, 606, 310, 13, 374, 141, 502, 269, 77, 438, 205, 566, 301, 45, 406, 173, 534, 342, 109, 470, 237, 598, 29, 390, 157, 518, 285, 93, 454, 221, 582, 326, 61, 422, 189, 550, 358, 125, 486, 253, 614, 3, 364, 131, 492, 259, 67, 428, 195, 556, 291, 35, 396, 163, 524, 332, 99, 460, 227, 588, 19, 380, 147, 508, 275, 83, 444, 211, 572, 316, 51, 412, 179, 540, 348, 115, 476, 243, 604, 307, 11, 372, 139, 500, 267, 75, 436, 203, 564, 299, 43, 404, 171, 532, 340, 107, 468, 235, 596, 27, 388, 155, 516, 283, 91, 452, 219, 580, 324, 59, 420, 187, 548, 356, 123, 484, 251, 612, 7, 368, 135, 496, 263, 71, 432, 199, 560, 295, 39, 400, 167, 528, 336, 103, 464, 231, 592, 23, 384, 151, 512, 279, 87, 448, 215, 576, 320, 55, 416, 183, 544, 352, 119, 480, 247, 608, 312, 15, 376, 143, 504, 271, 79, 440, 207, 568, 303, 47, 408, 175, 536, 344, 111, 472, 239, 600, 31, 392, 159, 520, 287, 95, 456, 223, 584, 328, 63, 424, 191, 552, 360, 127, 488, 255, 616]; - - return (unsafe{*PERM617.get_unchecked((index % 617) as usize)} as u32 * 380689 + - unsafe{*PERM617.get_unchecked(((index / 617) % 617) as usize)} as u32 * 617 + - unsafe{*PERM617.get_unchecked(((index / 380689) % 617) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (234885113u32 as f32)); // Results in [0,1). -} - - -fn halton619(index: u32) -> f32 { - const PERM619: [u16; 619] = [0, 363, 128, 491, 256, 64, 427, 192, 555, 288, 32, 395, 160, 523, 331, 96, 459, 224, 587, 16, 379, 144, 507, 272, 80, 443, 208, 571, 315, 48, 411, 176, 539, 347, 112, 475, 240, 603, 304, 8, 371, 136, 499, 264, 72, 435, 200, 563, 296, 40, 403, 168, 531, 339, 104, 467, 232, 595, 24, 387, 152, 515, 280, 88, 451, 216, 579, 323, 56, 419, 184, 547, 355, 120, 483, 248, 611, 4, 367, 132, 495, 260, 68, 431, 196, 559, 292, 36, 399, 164, 527, 335, 100, 463, 228, 591, 20, 383, 148, 511, 276, 84, 447, 212, 575, 319, 52, 415, 180, 543, 351, 116, 479, 244, 607, 311, 12, 375, 140, 503, 268, 76, 439, 204, 567, 300, 44, 407, 172, 535, 343, 108, 471, 236, 599, 28, 391, 156, 519, 284, 92, 455, 220, 583, 327, 60, 423, 188, 551, 359, 124, 487, 252, 615, 308, 2, 365, 130, 493, 258, 66, 429, 194, 557, 290, 34, 397, 162, 525, 333, 98, 461, 226, 589, 18, 381, 146, 509, 274, 82, 445, 210, 573, 317, 50, 413, 178, 541, 349, 114, 477, 242, 605, 306, 10, 373, 138, 501, 266, 74, 437, 202, 565, 298, 42, 405, 170, 533, 341, 106, 469, 234, 597, 26, 389, 154, 517, 282, 90, 453, 218, 581, 325, 58, 421, 186, 549, 357, 122, 485, 250, 613, 6, 369, 134, 497, 262, 70, 433, 198, 561, 294, 38, 401, 166, 529, 337, 102, 465, 230, 593, 22, 385, 150, 513, 278, 86, 449, 214, 577, 321, 54, 417, 182, 545, 353, 118, 481, 246, 609, 313, 14, 377, 142, 505, 270, 78, 441, 206, 569, 302, 46, 409, 174, 537, 345, 110, 473, 238, 601, 30, 393, 158, 521, 286, 94, 457, 222, 585, 329, 62, 425, 190, 553, 361, 126, 489, 254, 617, 309, 1, 364, 129, 492, 257, 65, 428, 193, 556, 289, 33, 396, 161, 524, 332, 97, 460, 225, 588, 17, 380, 145, 508, 273, 81, 444, 209, 572, 316, 49, 412, 177, 540, 348, 113, 476, 241, 604, 305, 9, 372, 137, 500, 265, 73, 436, 201, 564, 297, 41, 404, 169, 532, 340, 105, 468, 233, 596, 25, 388, 153, 516, 281, 89, 452, 217, 580, 324, 57, 420, 185, 548, 356, 121, 484, 249, 612, 5, 368, 133, 496, 261, 69, 432, 197, 560, 293, 37, 400, 165, 528, 336, 101, 464, 229, 592, 21, 384, 149, 512, 277, 85, 448, 213, 576, 320, 53, 416, 181, 544, 352, 117, 480, 245, 608, 312, 13, 376, 141, 504, 269, 77, 440, 205, 568, 301, 45, 408, 173, 536, 344, 109, 472, 237, 600, 29, 392, 157, 520, 285, 93, 456, 221, 584, 328, 61, 424, 189, 552, 360, 125, 488, 253, 616, 310, 3, 366, 131, 494, 259, 67, 430, 195, 558, 291, 35, 398, 163, 526, 334, 99, 462, 227, 590, 19, 382, 147, 510, 275, 83, 446, 211, 574, 318, 51, 414, 179, 542, 350, 115, 478, 243, 606, 307, 11, 374, 139, 502, 267, 75, 438, 203, 566, 299, 43, 406, 171, 534, 342, 107, 470, 235, 598, 27, 390, 155, 518, 283, 91, 454, 219, 582, 326, 59, 422, 187, 550, 358, 123, 486, 251, 614, 7, 370, 135, 498, 263, 71, 434, 199, 562, 295, 39, 402, 167, 530, 338, 103, 466, 231, 594, 23, 386, 151, 514, 279, 87, 450, 215, 578, 322, 55, 418, 183, 546, 354, 119, 482, 247, 610, 314, 15, 378, 143, 506, 271, 79, 442, 207, 570, 303, 47, 410, 175, 538, 346, 111, 474, 239, 602, 31, 394, 159, 522, 287, 95, 458, 223, 586, 330, 63, 426, 191, 554, 362, 127, 490, 255, 618]; - - return (unsafe{*PERM619.get_unchecked((index % 619) as usize)} as u32 * 383161 + - unsafe{*PERM619.get_unchecked(((index / 619) % 619) as usize)} as u32 * 619 + - unsafe{*PERM619.get_unchecked(((index / 383161) % 619) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (237176659u32 as f32)); // Results in [0,1). -} - - -fn halton631(index: u32) -> f32 { - const PERM631: [u16; 631] = [0, 375, 128, 503, 256, 64, 439, 192, 567, 288, 32, 407, 160, 535, 343, 96, 471, 224, 599, 304, 16, 391, 144, 519, 272, 80, 455, 208, 583, 327, 48, 423, 176, 551, 359, 112, 487, 240, 615, 8, 383, 136, 511, 264, 72, 447, 200, 575, 296, 40, 415, 168, 543, 351, 104, 479, 232, 607, 319, 24, 399, 152, 527, 280, 88, 463, 216, 591, 335, 56, 431, 184, 559, 367, 120, 495, 248, 623, 312, 4, 379, 132, 507, 260, 68, 443, 196, 571, 292, 36, 411, 164, 539, 347, 100, 475, 228, 603, 308, 20, 395, 148, 523, 276, 84, 459, 212, 587, 331, 52, 427, 180, 555, 363, 116, 491, 244, 619, 12, 387, 140, 515, 268, 76, 451, 204, 579, 300, 44, 419, 172, 547, 355, 108, 483, 236, 611, 323, 28, 403, 156, 531, 284, 92, 467, 220, 595, 339, 60, 435, 188, 563, 371, 124, 499, 252, 627, 314, 2, 377, 130, 505, 258, 66, 441, 194, 569, 290, 34, 409, 162, 537, 345, 98, 473, 226, 601, 306, 18, 393, 146, 521, 274, 82, 457, 210, 585, 329, 50, 425, 178, 553, 361, 114, 489, 242, 617, 10, 385, 138, 513, 266, 74, 449, 202, 577, 298, 42, 417, 170, 545, 353, 106, 481, 234, 609, 321, 26, 401, 154, 529, 282, 90, 465, 218, 593, 337, 58, 433, 186, 561, 369, 122, 497, 250, 625, 317, 6, 381, 134, 509, 262, 70, 445, 198, 573, 294, 38, 413, 166, 541, 349, 102, 477, 230, 605, 310, 22, 397, 150, 525, 278, 86, 461, 214, 589, 333, 54, 429, 182, 557, 365, 118, 493, 246, 621, 14, 389, 142, 517, 270, 78, 453, 206, 581, 302, 46, 421, 174, 549, 357, 110, 485, 238, 613, 325, 30, 405, 158, 533, 286, 94, 469, 222, 597, 341, 62, 437, 190, 565, 373, 126, 501, 254, 629, 315, 1, 376, 129, 504, 257, 65, 440, 193, 568, 289, 33, 408, 161, 536, 344, 97, 472, 225, 600, 305, 17, 392, 145, 520, 273, 81, 456, 209, 584, 328, 49, 424, 177, 552, 360, 113, 488, 241, 616, 9, 384, 137, 512, 265, 73, 448, 201, 576, 297, 41, 416, 169, 544, 352, 105, 480, 233, 608, 320, 25, 400, 153, 528, 281, 89, 464, 217, 592, 336, 57, 432, 185, 560, 368, 121, 496, 249, 624, 313, 5, 380, 133, 508, 261, 69, 444, 197, 572, 293, 37, 412, 165, 540, 348, 101, 476, 229, 604, 309, 21, 396, 149, 524, 277, 85, 460, 213, 588, 332, 53, 428, 181, 556, 364, 117, 492, 245, 620, 13, 388, 141, 516, 269, 77, 452, 205, 580, 301, 45, 420, 173, 548, 356, 109, 484, 237, 612, 324, 29, 404, 157, 532, 285, 93, 468, 221, 596, 340, 61, 436, 189, 564, 372, 125, 500, 253, 628, 316, 3, 378, 131, 506, 259, 67, 442, 195, 570, 291, 35, 410, 163, 538, 346, 99, 474, 227, 602, 307, 19, 394, 147, 522, 275, 83, 458, 211, 586, 330, 51, 426, 179, 554, 362, 115, 490, 243, 618, 11, 386, 139, 514, 267, 75, 450, 203, 578, 299, 43, 418, 171, 546, 354, 107, 482, 235, 610, 322, 27, 402, 155, 530, 283, 91, 466, 219, 594, 338, 59, 434, 187, 562, 370, 123, 498, 251, 626, 318, 7, 382, 135, 510, 263, 71, 446, 199, 574, 295, 39, 414, 167, 542, 350, 103, 478, 231, 606, 311, 23, 398, 151, 526, 279, 87, 462, 215, 590, 334, 55, 430, 183, 558, 366, 119, 494, 247, 622, 15, 390, 143, 518, 271, 79, 454, 207, 582, 303, 47, 422, 175, 550, 358, 111, 486, 239, 614, 326, 31, 406, 159, 534, 287, 95, 470, 223, 598, 342, 63, 438, 191, 566, 374, 127, 502, 255, 630]; - - return (unsafe{*PERM631.get_unchecked((index % 631) as usize)} as u32 * 398161 + - unsafe{*PERM631.get_unchecked(((index / 631) % 631) as usize)} as u32 * 631 + - unsafe{*PERM631.get_unchecked(((index / 398161) % 631) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (251239591u32 as f32)); // Results in [0,1). -} - - -fn halton641(index: u32) -> f32 { - const PERM641: [u16; 641] = [0, 385, 256, 128, 513, 64, 449, 321, 192, 577, 32, 417, 288, 160, 545, 96, 481, 353, 224, 609, 16, 401, 272, 144, 529, 80, 465, 337, 208, 593, 48, 433, 304, 176, 561, 112, 497, 369, 240, 625, 8, 393, 264, 136, 521, 72, 457, 329, 200, 585, 40, 425, 296, 168, 553, 104, 489, 361, 232, 617, 24, 409, 280, 152, 537, 88, 473, 345, 216, 601, 56, 441, 312, 184, 569, 120, 505, 377, 248, 633, 4, 389, 260, 132, 517, 68, 453, 325, 196, 581, 36, 421, 292, 164, 549, 100, 485, 357, 228, 613, 20, 405, 276, 148, 533, 84, 469, 341, 212, 597, 52, 437, 308, 180, 565, 116, 501, 373, 244, 629, 12, 397, 268, 140, 525, 76, 461, 333, 204, 589, 44, 429, 300, 172, 557, 108, 493, 365, 236, 621, 28, 413, 284, 156, 541, 92, 477, 349, 220, 605, 60, 445, 316, 188, 573, 124, 509, 381, 252, 637, 2, 387, 258, 130, 515, 66, 451, 323, 194, 579, 34, 419, 290, 162, 547, 98, 483, 355, 226, 611, 18, 403, 274, 146, 531, 82, 467, 339, 210, 595, 50, 435, 306, 178, 563, 114, 499, 371, 242, 627, 10, 395, 266, 138, 523, 74, 459, 331, 202, 587, 42, 427, 298, 170, 555, 106, 491, 363, 234, 619, 26, 411, 282, 154, 539, 90, 475, 347, 218, 603, 58, 443, 314, 186, 571, 122, 507, 379, 250, 635, 6, 391, 262, 134, 519, 70, 455, 327, 198, 583, 38, 423, 294, 166, 551, 102, 487, 359, 230, 615, 22, 407, 278, 150, 535, 86, 471, 343, 214, 599, 54, 439, 310, 182, 567, 118, 503, 375, 246, 631, 14, 399, 270, 142, 527, 78, 463, 335, 206, 591, 46, 431, 302, 174, 559, 110, 495, 367, 238, 623, 30, 415, 286, 158, 543, 94, 479, 351, 222, 607, 62, 447, 318, 190, 575, 126, 511, 383, 254, 639, 320, 1, 386, 257, 129, 514, 65, 450, 322, 193, 578, 33, 418, 289, 161, 546, 97, 482, 354, 225, 610, 17, 402, 273, 145, 530, 81, 466, 338, 209, 594, 49, 434, 305, 177, 562, 113, 498, 370, 241, 626, 9, 394, 265, 137, 522, 73, 458, 330, 201, 586, 41, 426, 297, 169, 554, 105, 490, 362, 233, 618, 25, 410, 281, 153, 538, 89, 474, 346, 217, 602, 57, 442, 313, 185, 570, 121, 506, 378, 249, 634, 5, 390, 261, 133, 518, 69, 454, 326, 197, 582, 37, 422, 293, 165, 550, 101, 486, 358, 229, 614, 21, 406, 277, 149, 534, 85, 470, 342, 213, 598, 53, 438, 309, 181, 566, 117, 502, 374, 245, 630, 13, 398, 269, 141, 526, 77, 462, 334, 205, 590, 45, 430, 301, 173, 558, 109, 494, 366, 237, 622, 29, 414, 285, 157, 542, 93, 478, 350, 221, 606, 61, 446, 317, 189, 574, 125, 510, 382, 253, 638, 3, 388, 259, 131, 516, 67, 452, 324, 195, 580, 35, 420, 291, 163, 548, 99, 484, 356, 227, 612, 19, 404, 275, 147, 532, 83, 468, 340, 211, 596, 51, 436, 307, 179, 564, 115, 500, 372, 243, 628, 11, 396, 267, 139, 524, 75, 460, 332, 203, 588, 43, 428, 299, 171, 556, 107, 492, 364, 235, 620, 27, 412, 283, 155, 540, 91, 476, 348, 219, 604, 59, 444, 315, 187, 572, 123, 508, 380, 251, 636, 7, 392, 263, 135, 520, 71, 456, 328, 199, 584, 39, 424, 295, 167, 552, 103, 488, 360, 231, 616, 23, 408, 279, 151, 536, 87, 472, 344, 215, 600, 55, 440, 311, 183, 568, 119, 504, 376, 247, 632, 15, 400, 271, 143, 528, 79, 464, 336, 207, 592, 47, 432, 303, 175, 560, 111, 496, 368, 239, 624, 31, 416, 287, 159, 544, 95, 480, 352, 223, 608, 63, 448, 319, 191, 576, 127, 512, 384, 255, 640]; - - return (unsafe{*PERM641.get_unchecked((index % 641) as usize)} as u32 * 410881 + - unsafe{*PERM641.get_unchecked(((index / 641) % 641) as usize)} as u32 * 641 + - unsafe{*PERM641.get_unchecked(((index / 410881) % 641) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (263374721u32 as f32)); // Results in [0,1). -} - - -fn halton643(index: u32) -> f32 { - const PERM643: [u16; 643] = [0, 387, 256, 128, 515, 64, 451, 323, 192, 579, 32, 419, 288, 160, 547, 96, 483, 355, 224, 611, 16, 403, 272, 144, 531, 80, 467, 339, 208, 595, 48, 435, 304, 176, 563, 112, 499, 371, 240, 627, 8, 395, 264, 136, 523, 72, 459, 331, 200, 587, 40, 427, 296, 168, 555, 104, 491, 363, 232, 619, 24, 411, 280, 152, 539, 88, 475, 347, 216, 603, 56, 443, 312, 184, 571, 120, 507, 379, 248, 635, 4, 391, 260, 132, 519, 68, 455, 327, 196, 583, 36, 423, 292, 164, 551, 100, 487, 359, 228, 615, 20, 407, 276, 148, 535, 84, 471, 343, 212, 599, 52, 439, 308, 180, 567, 116, 503, 375, 244, 631, 12, 399, 268, 140, 527, 76, 463, 335, 204, 591, 44, 431, 300, 172, 559, 108, 495, 367, 236, 623, 28, 415, 284, 156, 543, 92, 479, 351, 220, 607, 60, 447, 316, 188, 575, 124, 511, 383, 252, 639, 320, 2, 389, 258, 130, 517, 66, 453, 325, 194, 581, 34, 421, 290, 162, 549, 98, 485, 357, 226, 613, 18, 405, 274, 146, 533, 82, 469, 341, 210, 597, 50, 437, 306, 178, 565, 114, 501, 373, 242, 629, 10, 397, 266, 138, 525, 74, 461, 333, 202, 589, 42, 429, 298, 170, 557, 106, 493, 365, 234, 621, 26, 413, 282, 154, 541, 90, 477, 349, 218, 605, 58, 445, 314, 186, 573, 122, 509, 381, 250, 637, 6, 393, 262, 134, 521, 70, 457, 329, 198, 585, 38, 425, 294, 166, 553, 102, 489, 361, 230, 617, 22, 409, 278, 150, 537, 86, 473, 345, 214, 601, 54, 441, 310, 182, 569, 118, 505, 377, 246, 633, 14, 401, 270, 142, 529, 78, 465, 337, 206, 593, 46, 433, 302, 174, 561, 110, 497, 369, 238, 625, 30, 417, 286, 158, 545, 94, 481, 353, 222, 609, 62, 449, 318, 190, 577, 126, 513, 385, 254, 641, 321, 1, 388, 257, 129, 516, 65, 452, 324, 193, 580, 33, 420, 289, 161, 548, 97, 484, 356, 225, 612, 17, 404, 273, 145, 532, 81, 468, 340, 209, 596, 49, 436, 305, 177, 564, 113, 500, 372, 241, 628, 9, 396, 265, 137, 524, 73, 460, 332, 201, 588, 41, 428, 297, 169, 556, 105, 492, 364, 233, 620, 25, 412, 281, 153, 540, 89, 476, 348, 217, 604, 57, 444, 313, 185, 572, 121, 508, 380, 249, 636, 5, 392, 261, 133, 520, 69, 456, 328, 197, 584, 37, 424, 293, 165, 552, 101, 488, 360, 229, 616, 21, 408, 277, 149, 536, 85, 472, 344, 213, 600, 53, 440, 309, 181, 568, 117, 504, 376, 245, 632, 13, 400, 269, 141, 528, 77, 464, 336, 205, 592, 45, 432, 301, 173, 560, 109, 496, 368, 237, 624, 29, 416, 285, 157, 544, 93, 480, 352, 221, 608, 61, 448, 317, 189, 576, 125, 512, 384, 253, 640, 322, 3, 390, 259, 131, 518, 67, 454, 326, 195, 582, 35, 422, 291, 163, 550, 99, 486, 358, 227, 614, 19, 406, 275, 147, 534, 83, 470, 342, 211, 598, 51, 438, 307, 179, 566, 115, 502, 374, 243, 630, 11, 398, 267, 139, 526, 75, 462, 334, 203, 590, 43, 430, 299, 171, 558, 107, 494, 366, 235, 622, 27, 414, 283, 155, 542, 91, 478, 350, 219, 606, 59, 446, 315, 187, 574, 123, 510, 382, 251, 638, 7, 394, 263, 135, 522, 71, 458, 330, 199, 586, 39, 426, 295, 167, 554, 103, 490, 362, 231, 618, 23, 410, 279, 151, 538, 87, 474, 346, 215, 602, 55, 442, 311, 183, 570, 119, 506, 378, 247, 634, 15, 402, 271, 143, 530, 79, 466, 338, 207, 594, 47, 434, 303, 175, 562, 111, 498, 370, 239, 626, 31, 418, 287, 159, 546, 95, 482, 354, 223, 610, 63, 450, 319, 191, 578, 127, 514, 386, 255, 642]; - - return (unsafe{*PERM643.get_unchecked((index % 643) as usize)} as u32 * 413449 + - unsafe{*PERM643.get_unchecked(((index / 643) % 643) as usize)} as u32 * 643 + - unsafe{*PERM643.get_unchecked(((index / 413449) % 643) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (265847707u32 as f32)); // Results in [0,1). -} - - -fn halton647(index: u32) -> f32 { - const PERM647: [u16; 647] = [0, 391, 256, 128, 519, 64, 455, 327, 192, 583, 32, 423, 288, 160, 551, 96, 487, 359, 224, 615, 16, 407, 272, 144, 535, 80, 471, 343, 208, 599, 48, 439, 304, 176, 567, 112, 503, 375, 240, 631, 8, 399, 264, 136, 527, 72, 463, 335, 200, 591, 40, 431, 296, 168, 559, 104, 495, 367, 232, 623, 24, 415, 280, 152, 543, 88, 479, 351, 216, 607, 56, 447, 312, 184, 575, 120, 511, 383, 248, 639, 320, 4, 395, 260, 132, 523, 68, 459, 331, 196, 587, 36, 427, 292, 164, 555, 100, 491, 363, 228, 619, 20, 411, 276, 148, 539, 84, 475, 347, 212, 603, 52, 443, 308, 180, 571, 116, 507, 379, 244, 635, 12, 403, 268, 140, 531, 76, 467, 339, 204, 595, 44, 435, 300, 172, 563, 108, 499, 371, 236, 627, 28, 419, 284, 156, 547, 92, 483, 355, 220, 611, 60, 451, 316, 188, 579, 124, 515, 387, 252, 643, 322, 2, 393, 258, 130, 521, 66, 457, 329, 194, 585, 34, 425, 290, 162, 553, 98, 489, 361, 226, 617, 18, 409, 274, 146, 537, 82, 473, 345, 210, 601, 50, 441, 306, 178, 569, 114, 505, 377, 242, 633, 10, 401, 266, 138, 529, 74, 465, 337, 202, 593, 42, 433, 298, 170, 561, 106, 497, 369, 234, 625, 26, 417, 282, 154, 545, 90, 481, 353, 218, 609, 58, 449, 314, 186, 577, 122, 513, 385, 250, 641, 325, 6, 397, 262, 134, 525, 70, 461, 333, 198, 589, 38, 429, 294, 166, 557, 102, 493, 365, 230, 621, 22, 413, 278, 150, 541, 86, 477, 349, 214, 605, 54, 445, 310, 182, 573, 118, 509, 381, 246, 637, 14, 405, 270, 142, 533, 78, 469, 341, 206, 597, 46, 437, 302, 174, 565, 110, 501, 373, 238, 629, 30, 421, 286, 158, 549, 94, 485, 357, 222, 613, 62, 453, 318, 190, 581, 126, 517, 389, 254, 645, 323, 1, 392, 257, 129, 520, 65, 456, 328, 193, 584, 33, 424, 289, 161, 552, 97, 488, 360, 225, 616, 17, 408, 273, 145, 536, 81, 472, 344, 209, 600, 49, 440, 305, 177, 568, 113, 504, 376, 241, 632, 9, 400, 265, 137, 528, 73, 464, 336, 201, 592, 41, 432, 297, 169, 560, 105, 496, 368, 233, 624, 25, 416, 281, 153, 544, 89, 480, 352, 217, 608, 57, 448, 313, 185, 576, 121, 512, 384, 249, 640, 321, 5, 396, 261, 133, 524, 69, 460, 332, 197, 588, 37, 428, 293, 165, 556, 101, 492, 364, 229, 620, 21, 412, 277, 149, 540, 85, 476, 348, 213, 604, 53, 444, 309, 181, 572, 117, 508, 380, 245, 636, 13, 404, 269, 141, 532, 77, 468, 340, 205, 596, 45, 436, 301, 173, 564, 109, 500, 372, 237, 628, 29, 420, 285, 157, 548, 93, 484, 356, 221, 612, 61, 452, 317, 189, 580, 125, 516, 388, 253, 644, 324, 3, 394, 259, 131, 522, 67, 458, 330, 195, 586, 35, 426, 291, 163, 554, 99, 490, 362, 227, 618, 19, 410, 275, 147, 538, 83, 474, 346, 211, 602, 51, 442, 307, 179, 570, 115, 506, 378, 243, 634, 11, 402, 267, 139, 530, 75, 466, 338, 203, 594, 43, 434, 299, 171, 562, 107, 498, 370, 235, 626, 27, 418, 283, 155, 546, 91, 482, 354, 219, 610, 59, 450, 315, 187, 578, 123, 514, 386, 251, 642, 326, 7, 398, 263, 135, 526, 71, 462, 334, 199, 590, 39, 430, 295, 167, 558, 103, 494, 366, 231, 622, 23, 414, 279, 151, 542, 87, 478, 350, 215, 606, 55, 446, 311, 183, 574, 119, 510, 382, 247, 638, 15, 406, 271, 143, 534, 79, 470, 342, 207, 598, 47, 438, 303, 175, 566, 111, 502, 374, 239, 630, 31, 422, 287, 159, 550, 95, 486, 358, 223, 614, 63, 454, 319, 191, 582, 127, 518, 390, 255, 646]; - - return (unsafe{*PERM647.get_unchecked((index % 647) as usize)} as u32 * 418609 + - unsafe{*PERM647.get_unchecked(((index / 647) % 647) as usize)} as u32 * 647 + - unsafe{*PERM647.get_unchecked(((index / 418609) % 647) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (270840023u32 as f32)); // Results in [0,1). -} - - -fn halton653(index: u32) -> f32 { - const PERM653: [u16; 653] = [0, 397, 256, 128, 525, 64, 461, 333, 192, 589, 32, 429, 288, 160, 557, 96, 493, 365, 224, 621, 16, 413, 272, 144, 541, 80, 477, 349, 208, 605, 48, 445, 304, 176, 573, 112, 509, 381, 240, 637, 320, 8, 405, 264, 136, 533, 72, 469, 341, 200, 597, 40, 437, 296, 168, 565, 104, 501, 373, 232, 629, 24, 421, 280, 152, 549, 88, 485, 357, 216, 613, 56, 453, 312, 184, 581, 120, 517, 389, 248, 645, 324, 4, 401, 260, 132, 529, 68, 465, 337, 196, 593, 36, 433, 292, 164, 561, 100, 497, 369, 228, 625, 20, 417, 276, 148, 545, 84, 481, 353, 212, 609, 52, 449, 308, 180, 577, 116, 513, 385, 244, 641, 329, 12, 409, 268, 140, 537, 76, 473, 345, 204, 601, 44, 441, 300, 172, 569, 108, 505, 377, 236, 633, 28, 425, 284, 156, 553, 92, 489, 361, 220, 617, 60, 457, 316, 188, 585, 124, 521, 393, 252, 649, 2, 399, 258, 130, 527, 66, 463, 335, 194, 591, 34, 431, 290, 162, 559, 98, 495, 367, 226, 623, 18, 415, 274, 146, 543, 82, 479, 351, 210, 607, 50, 447, 306, 178, 575, 114, 511, 383, 242, 639, 322, 10, 407, 266, 138, 535, 74, 471, 343, 202, 599, 42, 439, 298, 170, 567, 106, 503, 375, 234, 631, 26, 423, 282, 154, 551, 90, 487, 359, 218, 615, 58, 455, 314, 186, 583, 122, 519, 391, 250, 647, 327, 6, 403, 262, 134, 531, 70, 467, 339, 198, 595, 38, 435, 294, 166, 563, 102, 499, 371, 230, 627, 22, 419, 278, 150, 547, 86, 483, 355, 214, 611, 54, 451, 310, 182, 579, 118, 515, 387, 246, 643, 331, 14, 411, 270, 142, 539, 78, 475, 347, 206, 603, 46, 443, 302, 174, 571, 110, 507, 379, 238, 635, 30, 427, 286, 158, 555, 94, 491, 363, 222, 619, 62, 459, 318, 190, 587, 126, 523, 395, 254, 651, 326, 1, 398, 257, 129, 526, 65, 462, 334, 193, 590, 33, 430, 289, 161, 558, 97, 494, 366, 225, 622, 17, 414, 273, 145, 542, 81, 478, 350, 209, 606, 49, 446, 305, 177, 574, 113, 510, 382, 241, 638, 321, 9, 406, 265, 137, 534, 73, 470, 342, 201, 598, 41, 438, 297, 169, 566, 105, 502, 374, 233, 630, 25, 422, 281, 153, 550, 89, 486, 358, 217, 614, 57, 454, 313, 185, 582, 121, 518, 390, 249, 646, 325, 5, 402, 261, 133, 530, 69, 466, 338, 197, 594, 37, 434, 293, 165, 562, 101, 498, 370, 229, 626, 21, 418, 277, 149, 546, 85, 482, 354, 213, 610, 53, 450, 309, 181, 578, 117, 514, 386, 245, 642, 330, 13, 410, 269, 141, 538, 77, 474, 346, 205, 602, 45, 442, 301, 173, 570, 109, 506, 378, 237, 634, 29, 426, 285, 157, 554, 93, 490, 362, 221, 618, 61, 458, 317, 189, 586, 125, 522, 394, 253, 650, 3, 400, 259, 131, 528, 67, 464, 336, 195, 592, 35, 432, 291, 163, 560, 99, 496, 368, 227, 624, 19, 416, 275, 147, 544, 83, 480, 352, 211, 608, 51, 448, 307, 179, 576, 115, 512, 384, 243, 640, 323, 11, 408, 267, 139, 536, 75, 472, 344, 203, 600, 43, 440, 299, 171, 568, 107, 504, 376, 235, 632, 27, 424, 283, 155, 552, 91, 488, 360, 219, 616, 59, 456, 315, 187, 584, 123, 520, 392, 251, 648, 328, 7, 404, 263, 135, 532, 71, 468, 340, 199, 596, 39, 436, 295, 167, 564, 103, 500, 372, 231, 628, 23, 420, 279, 151, 548, 87, 484, 356, 215, 612, 55, 452, 311, 183, 580, 119, 516, 388, 247, 644, 332, 15, 412, 271, 143, 540, 79, 476, 348, 207, 604, 47, 444, 303, 175, 572, 111, 508, 380, 239, 636, 31, 428, 287, 159, 556, 95, 492, 364, 223, 620, 63, 460, 319, 191, 588, 127, 524, 396, 255, 652]; - - return (unsafe{*PERM653.get_unchecked((index % 653) as usize)} as u32 * 426409 + - unsafe{*PERM653.get_unchecked(((index / 653) % 653) as usize)} as u32 * 653 + - unsafe{*PERM653.get_unchecked(((index / 426409) % 653) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (278445077u32 as f32)); // Results in [0,1). -} - - -fn halton659(index: u32) -> f32 { - const PERM659: [u16; 659] = [0, 403, 256, 128, 531, 64, 467, 339, 192, 595, 32, 435, 288, 160, 563, 96, 499, 371, 224, 627, 320, 16, 419, 272, 144, 547, 80, 483, 355, 208, 611, 48, 451, 304, 176, 579, 112, 515, 387, 240, 643, 8, 411, 264, 136, 539, 72, 475, 347, 200, 603, 40, 443, 296, 168, 571, 104, 507, 379, 232, 635, 331, 24, 427, 280, 152, 555, 88, 491, 363, 216, 619, 56, 459, 312, 184, 587, 120, 523, 395, 248, 651, 4, 407, 260, 132, 535, 68, 471, 343, 196, 599, 36, 439, 292, 164, 567, 100, 503, 375, 228, 631, 324, 20, 423, 276, 148, 551, 84, 487, 359, 212, 615, 52, 455, 308, 180, 583, 116, 519, 391, 244, 647, 12, 415, 268, 140, 543, 76, 479, 351, 204, 607, 44, 447, 300, 172, 575, 108, 511, 383, 236, 639, 335, 28, 431, 284, 156, 559, 92, 495, 367, 220, 623, 60, 463, 316, 188, 591, 124, 527, 399, 252, 655, 328, 2, 405, 258, 130, 533, 66, 469, 341, 194, 597, 34, 437, 290, 162, 565, 98, 501, 373, 226, 629, 322, 18, 421, 274, 146, 549, 82, 485, 357, 210, 613, 50, 453, 306, 178, 581, 114, 517, 389, 242, 645, 10, 413, 266, 138, 541, 74, 477, 349, 202, 605, 42, 445, 298, 170, 573, 106, 509, 381, 234, 637, 333, 26, 429, 282, 154, 557, 90, 493, 365, 218, 621, 58, 461, 314, 186, 589, 122, 525, 397, 250, 653, 6, 409, 262, 134, 537, 70, 473, 345, 198, 601, 38, 441, 294, 166, 569, 102, 505, 377, 230, 633, 326, 22, 425, 278, 150, 553, 86, 489, 361, 214, 617, 54, 457, 310, 182, 585, 118, 521, 393, 246, 649, 14, 417, 270, 142, 545, 78, 481, 353, 206, 609, 46, 449, 302, 174, 577, 110, 513, 385, 238, 641, 337, 30, 433, 286, 158, 561, 94, 497, 369, 222, 625, 62, 465, 318, 190, 593, 126, 529, 401, 254, 657, 329, 1, 404, 257, 129, 532, 65, 468, 340, 193, 596, 33, 436, 289, 161, 564, 97, 500, 372, 225, 628, 321, 17, 420, 273, 145, 548, 81, 484, 356, 209, 612, 49, 452, 305, 177, 580, 113, 516, 388, 241, 644, 9, 412, 265, 137, 540, 73, 476, 348, 201, 604, 41, 444, 297, 169, 572, 105, 508, 380, 233, 636, 332, 25, 428, 281, 153, 556, 89, 492, 364, 217, 620, 57, 460, 313, 185, 588, 121, 524, 396, 249, 652, 5, 408, 261, 133, 536, 69, 472, 344, 197, 600, 37, 440, 293, 165, 568, 101, 504, 376, 229, 632, 325, 21, 424, 277, 149, 552, 85, 488, 360, 213, 616, 53, 456, 309, 181, 584, 117, 520, 392, 245, 648, 13, 416, 269, 141, 544, 77, 480, 352, 205, 608, 45, 448, 301, 173, 576, 109, 512, 384, 237, 640, 336, 29, 432, 285, 157, 560, 93, 496, 368, 221, 624, 61, 464, 317, 189, 592, 125, 528, 400, 253, 656, 330, 3, 406, 259, 131, 534, 67, 470, 342, 195, 598, 35, 438, 291, 163, 566, 99, 502, 374, 227, 630, 323, 19, 422, 275, 147, 550, 83, 486, 358, 211, 614, 51, 454, 307, 179, 582, 115, 518, 390, 243, 646, 11, 414, 267, 139, 542, 75, 478, 350, 203, 606, 43, 446, 299, 171, 574, 107, 510, 382, 235, 638, 334, 27, 430, 283, 155, 558, 91, 494, 366, 219, 622, 59, 462, 315, 187, 590, 123, 526, 398, 251, 654, 7, 410, 263, 135, 538, 71, 474, 346, 199, 602, 39, 442, 295, 167, 570, 103, 506, 378, 231, 634, 327, 23, 426, 279, 151, 554, 87, 490, 362, 215, 618, 55, 458, 311, 183, 586, 119, 522, 394, 247, 650, 15, 418, 271, 143, 546, 79, 482, 354, 207, 610, 47, 450, 303, 175, 578, 111, 514, 386, 239, 642, 338, 31, 434, 287, 159, 562, 95, 498, 370, 223, 626, 63, 466, 319, 191, 594, 127, 530, 402, 255, 658]; - - return (unsafe{*PERM659.get_unchecked((index % 659) as usize)} as u32 * 434281 + - unsafe{*PERM659.get_unchecked(((index / 659) % 659) as usize)} as u32 * 659 + - unsafe{*PERM659.get_unchecked(((index / 434281) % 659) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (286191179u32 as f32)); // Results in [0,1). -} - - -fn halton661(index: u32) -> f32 { - const PERM661: [u16; 661] = [0, 405, 256, 128, 533, 64, 469, 341, 192, 597, 32, 437, 288, 160, 565, 96, 501, 373, 224, 629, 320, 16, 421, 272, 144, 549, 80, 485, 357, 208, 613, 48, 453, 304, 176, 581, 112, 517, 389, 240, 645, 8, 413, 264, 136, 541, 72, 477, 349, 200, 605, 40, 445, 296, 168, 573, 104, 509, 381, 232, 637, 333, 24, 429, 280, 152, 557, 88, 493, 365, 216, 621, 56, 461, 312, 184, 589, 120, 525, 397, 248, 653, 328, 4, 409, 260, 132, 537, 68, 473, 345, 196, 601, 36, 441, 292, 164, 569, 100, 505, 377, 228, 633, 324, 20, 425, 276, 148, 553, 84, 489, 361, 212, 617, 52, 457, 308, 180, 585, 116, 521, 393, 244, 649, 12, 417, 268, 140, 545, 76, 481, 353, 204, 609, 44, 449, 300, 172, 577, 108, 513, 385, 236, 641, 337, 28, 433, 284, 156, 561, 92, 497, 369, 220, 625, 60, 465, 316, 188, 593, 124, 529, 401, 252, 657, 2, 407, 258, 130, 535, 66, 471, 343, 194, 599, 34, 439, 290, 162, 567, 98, 503, 375, 226, 631, 322, 18, 423, 274, 146, 551, 82, 487, 359, 210, 615, 50, 455, 306, 178, 583, 114, 519, 391, 242, 647, 10, 415, 266, 138, 543, 74, 479, 351, 202, 607, 42, 447, 298, 170, 575, 106, 511, 383, 234, 639, 335, 26, 431, 282, 154, 559, 90, 495, 367, 218, 623, 58, 463, 314, 186, 591, 122, 527, 399, 250, 655, 331, 6, 411, 262, 134, 539, 70, 475, 347, 198, 603, 38, 443, 294, 166, 571, 102, 507, 379, 230, 635, 326, 22, 427, 278, 150, 555, 86, 491, 363, 214, 619, 54, 459, 310, 182, 587, 118, 523, 395, 246, 651, 14, 419, 270, 142, 547, 78, 483, 355, 206, 611, 46, 451, 302, 174, 579, 110, 515, 387, 238, 643, 339, 30, 435, 286, 158, 563, 94, 499, 371, 222, 627, 62, 467, 318, 190, 595, 126, 531, 403, 254, 659, 330, 1, 406, 257, 129, 534, 65, 470, 342, 193, 598, 33, 438, 289, 161, 566, 97, 502, 374, 225, 630, 321, 17, 422, 273, 145, 550, 81, 486, 358, 209, 614, 49, 454, 305, 177, 582, 113, 518, 390, 241, 646, 9, 414, 265, 137, 542, 73, 478, 350, 201, 606, 41, 446, 297, 169, 574, 105, 510, 382, 233, 638, 334, 25, 430, 281, 153, 558, 89, 494, 366, 217, 622, 57, 462, 313, 185, 590, 121, 526, 398, 249, 654, 329, 5, 410, 261, 133, 538, 69, 474, 346, 197, 602, 37, 442, 293, 165, 570, 101, 506, 378, 229, 634, 325, 21, 426, 277, 149, 554, 85, 490, 362, 213, 618, 53, 458, 309, 181, 586, 117, 522, 394, 245, 650, 13, 418, 269, 141, 546, 77, 482, 354, 205, 610, 45, 450, 301, 173, 578, 109, 514, 386, 237, 642, 338, 29, 434, 285, 157, 562, 93, 498, 370, 221, 626, 61, 466, 317, 189, 594, 125, 530, 402, 253, 658, 3, 408, 259, 131, 536, 67, 472, 344, 195, 600, 35, 440, 291, 163, 568, 99, 504, 376, 227, 632, 323, 19, 424, 275, 147, 552, 83, 488, 360, 211, 616, 51, 456, 307, 179, 584, 115, 520, 392, 243, 648, 11, 416, 267, 139, 544, 75, 480, 352, 203, 608, 43, 448, 299, 171, 576, 107, 512, 384, 235, 640, 336, 27, 432, 283, 155, 560, 91, 496, 368, 219, 624, 59, 464, 315, 187, 592, 123, 528, 400, 251, 656, 332, 7, 412, 263, 135, 540, 71, 476, 348, 199, 604, 39, 444, 295, 167, 572, 103, 508, 380, 231, 636, 327, 23, 428, 279, 151, 556, 87, 492, 364, 215, 620, 55, 460, 311, 183, 588, 119, 524, 396, 247, 652, 15, 420, 271, 143, 548, 79, 484, 356, 207, 612, 47, 452, 303, 175, 580, 111, 516, 388, 239, 644, 340, 31, 436, 287, 159, 564, 95, 500, 372, 223, 628, 63, 468, 319, 191, 596, 127, 532, 404, 255, 660]; - - return (unsafe{*PERM661.get_unchecked((index % 661) as usize)} as u32 * 436921 + - unsafe{*PERM661.get_unchecked(((index / 661) % 661) as usize)} as u32 * 661 + - unsafe{*PERM661.get_unchecked(((index / 436921) % 661) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (288804781u32 as f32)); // Results in [0,1). -} - - -fn halton673(index: u32) -> f32 { - const PERM673: [u16; 673] = [0, 417, 256, 128, 545, 64, 481, 353, 192, 609, 320, 32, 449, 288, 160, 577, 96, 513, 385, 224, 641, 16, 433, 272, 144, 561, 80, 497, 369, 208, 625, 337, 48, 465, 304, 176, 593, 112, 529, 401, 240, 657, 8, 425, 264, 136, 553, 72, 489, 361, 200, 617, 328, 40, 457, 296, 168, 585, 104, 521, 393, 232, 649, 24, 441, 280, 152, 569, 88, 505, 377, 216, 633, 345, 56, 473, 312, 184, 601, 120, 537, 409, 248, 665, 4, 421, 260, 132, 549, 68, 485, 357, 196, 613, 324, 36, 453, 292, 164, 581, 100, 517, 389, 228, 645, 20, 437, 276, 148, 565, 84, 501, 373, 212, 629, 341, 52, 469, 308, 180, 597, 116, 533, 405, 244, 661, 12, 429, 268, 140, 557, 76, 493, 365, 204, 621, 332, 44, 461, 300, 172, 589, 108, 525, 397, 236, 653, 28, 445, 284, 156, 573, 92, 509, 381, 220, 637, 349, 60, 477, 316, 188, 605, 124, 541, 413, 252, 669, 2, 419, 258, 130, 547, 66, 483, 355, 194, 611, 322, 34, 451, 290, 162, 579, 98, 515, 387, 226, 643, 18, 435, 274, 146, 563, 82, 499, 371, 210, 627, 339, 50, 467, 306, 178, 595, 114, 531, 403, 242, 659, 10, 427, 266, 138, 555, 74, 491, 363, 202, 619, 330, 42, 459, 298, 170, 587, 106, 523, 395, 234, 651, 26, 443, 282, 154, 571, 90, 507, 379, 218, 635, 347, 58, 475, 314, 186, 603, 122, 539, 411, 250, 667, 6, 423, 262, 134, 551, 70, 487, 359, 198, 615, 326, 38, 455, 294, 166, 583, 102, 519, 391, 230, 647, 22, 439, 278, 150, 567, 86, 503, 375, 214, 631, 343, 54, 471, 310, 182, 599, 118, 535, 407, 246, 663, 14, 431, 270, 142, 559, 78, 495, 367, 206, 623, 334, 46, 463, 302, 174, 591, 110, 527, 399, 238, 655, 30, 447, 286, 158, 575, 94, 511, 383, 222, 639, 351, 62, 479, 318, 190, 607, 126, 543, 415, 254, 671, 336, 1, 418, 257, 129, 546, 65, 482, 354, 193, 610, 321, 33, 450, 289, 161, 578, 97, 514, 386, 225, 642, 17, 434, 273, 145, 562, 81, 498, 370, 209, 626, 338, 49, 466, 305, 177, 594, 113, 530, 402, 241, 658, 9, 426, 265, 137, 554, 73, 490, 362, 201, 618, 329, 41, 458, 297, 169, 586, 105, 522, 394, 233, 650, 25, 442, 281, 153, 570, 89, 506, 378, 217, 634, 346, 57, 474, 313, 185, 602, 121, 538, 410, 249, 666, 5, 422, 261, 133, 550, 69, 486, 358, 197, 614, 325, 37, 454, 293, 165, 582, 101, 518, 390, 229, 646, 21, 438, 277, 149, 566, 85, 502, 374, 213, 630, 342, 53, 470, 309, 181, 598, 117, 534, 406, 245, 662, 13, 430, 269, 141, 558, 77, 494, 366, 205, 622, 333, 45, 462, 301, 173, 590, 109, 526, 398, 237, 654, 29, 446, 285, 157, 574, 93, 510, 382, 221, 638, 350, 61, 478, 317, 189, 606, 125, 542, 414, 253, 670, 3, 420, 259, 131, 548, 67, 484, 356, 195, 612, 323, 35, 452, 291, 163, 580, 99, 516, 388, 227, 644, 19, 436, 275, 147, 564, 83, 500, 372, 211, 628, 340, 51, 468, 307, 179, 596, 115, 532, 404, 243, 660, 11, 428, 267, 139, 556, 75, 492, 364, 203, 620, 331, 43, 460, 299, 171, 588, 107, 524, 396, 235, 652, 27, 444, 283, 155, 572, 91, 508, 380, 219, 636, 348, 59, 476, 315, 187, 604, 123, 540, 412, 251, 668, 7, 424, 263, 135, 552, 71, 488, 360, 199, 616, 327, 39, 456, 295, 167, 584, 103, 520, 392, 231, 648, 23, 440, 279, 151, 568, 87, 504, 376, 215, 632, 344, 55, 472, 311, 183, 600, 119, 536, 408, 247, 664, 15, 432, 271, 143, 560, 79, 496, 368, 207, 624, 335, 47, 464, 303, 175, 592, 111, 528, 400, 239, 656, 31, 448, 287, 159, 576, 95, 512, 384, 223, 640, 352, 63, 480, 319, 191, 608, 127, 544, 416, 255, 672]; - - return (unsafe{*PERM673.get_unchecked((index % 673) as usize)} as u32 * 452929 + - unsafe{*PERM673.get_unchecked(((index / 673) % 673) as usize)} as u32 * 673 + - unsafe{*PERM673.get_unchecked(((index / 452929) % 673) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (304821217u32 as f32)); // Results in [0,1). -} - - -fn halton677(index: u32) -> f32 { - const PERM677: [u16; 677] = [0, 421, 256, 128, 549, 64, 485, 357, 192, 613, 320, 32, 453, 288, 160, 581, 96, 517, 389, 224, 645, 16, 437, 272, 144, 565, 80, 501, 373, 208, 629, 341, 48, 469, 304, 176, 597, 112, 533, 405, 240, 661, 8, 429, 264, 136, 557, 72, 493, 365, 200, 621, 328, 40, 461, 296, 168, 589, 104, 525, 397, 232, 653, 24, 445, 280, 152, 573, 88, 509, 381, 216, 637, 349, 56, 477, 312, 184, 605, 120, 541, 413, 248, 669, 336, 4, 425, 260, 132, 553, 68, 489, 361, 196, 617, 324, 36, 457, 292, 164, 585, 100, 521, 393, 228, 649, 20, 441, 276, 148, 569, 84, 505, 377, 212, 633, 345, 52, 473, 308, 180, 601, 116, 537, 409, 244, 665, 12, 433, 268, 140, 561, 76, 497, 369, 204, 625, 332, 44, 465, 300, 172, 593, 108, 529, 401, 236, 657, 28, 449, 284, 156, 577, 92, 513, 385, 220, 641, 353, 60, 481, 316, 188, 609, 124, 545, 417, 252, 673, 2, 423, 258, 130, 551, 66, 487, 359, 194, 615, 322, 34, 455, 290, 162, 583, 98, 519, 391, 226, 647, 18, 439, 274, 146, 567, 82, 503, 375, 210, 631, 343, 50, 471, 306, 178, 599, 114, 535, 407, 242, 663, 10, 431, 266, 138, 559, 74, 495, 367, 202, 623, 330, 42, 463, 298, 170, 591, 106, 527, 399, 234, 655, 26, 447, 282, 154, 575, 90, 511, 383, 218, 639, 351, 58, 479, 314, 186, 607, 122, 543, 415, 250, 671, 339, 6, 427, 262, 134, 555, 70, 491, 363, 198, 619, 326, 38, 459, 294, 166, 587, 102, 523, 395, 230, 651, 22, 443, 278, 150, 571, 86, 507, 379, 214, 635, 347, 54, 475, 310, 182, 603, 118, 539, 411, 246, 667, 14, 435, 270, 142, 563, 78, 499, 371, 206, 627, 334, 46, 467, 302, 174, 595, 110, 531, 403, 238, 659, 30, 451, 286, 158, 579, 94, 515, 387, 222, 643, 355, 62, 483, 318, 190, 611, 126, 547, 419, 254, 675, 338, 1, 422, 257, 129, 550, 65, 486, 358, 193, 614, 321, 33, 454, 289, 161, 582, 97, 518, 390, 225, 646, 17, 438, 273, 145, 566, 81, 502, 374, 209, 630, 342, 49, 470, 305, 177, 598, 113, 534, 406, 241, 662, 9, 430, 265, 137, 558, 73, 494, 366, 201, 622, 329, 41, 462, 297, 169, 590, 105, 526, 398, 233, 654, 25, 446, 281, 153, 574, 89, 510, 382, 217, 638, 350, 57, 478, 313, 185, 606, 121, 542, 414, 249, 670, 337, 5, 426, 261, 133, 554, 69, 490, 362, 197, 618, 325, 37, 458, 293, 165, 586, 101, 522, 394, 229, 650, 21, 442, 277, 149, 570, 85, 506, 378, 213, 634, 346, 53, 474, 309, 181, 602, 117, 538, 410, 245, 666, 13, 434, 269, 141, 562, 77, 498, 370, 205, 626, 333, 45, 466, 301, 173, 594, 109, 530, 402, 237, 658, 29, 450, 285, 157, 578, 93, 514, 386, 221, 642, 354, 61, 482, 317, 189, 610, 125, 546, 418, 253, 674, 3, 424, 259, 131, 552, 67, 488, 360, 195, 616, 323, 35, 456, 291, 163, 584, 99, 520, 392, 227, 648, 19, 440, 275, 147, 568, 83, 504, 376, 211, 632, 344, 51, 472, 307, 179, 600, 115, 536, 408, 243, 664, 11, 432, 267, 139, 560, 75, 496, 368, 203, 624, 331, 43, 464, 299, 171, 592, 107, 528, 400, 235, 656, 27, 448, 283, 155, 576, 91, 512, 384, 219, 640, 352, 59, 480, 315, 187, 608, 123, 544, 416, 251, 672, 340, 7, 428, 263, 135, 556, 71, 492, 364, 199, 620, 327, 39, 460, 295, 167, 588, 103, 524, 396, 231, 652, 23, 444, 279, 151, 572, 87, 508, 380, 215, 636, 348, 55, 476, 311, 183, 604, 119, 540, 412, 247, 668, 15, 436, 271, 143, 564, 79, 500, 372, 207, 628, 335, 47, 468, 303, 175, 596, 111, 532, 404, 239, 660, 31, 452, 287, 159, 580, 95, 516, 388, 223, 644, 356, 63, 484, 319, 191, 612, 127, 548, 420, 255, 676]; - - return (unsafe{*PERM677.get_unchecked((index % 677) as usize)} as u32 * 458329 + - unsafe{*PERM677.get_unchecked(((index / 677) % 677) as usize)} as u32 * 677 + - unsafe{*PERM677.get_unchecked(((index / 458329) % 677) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (310288733u32 as f32)); // Results in [0,1). -} - - -fn halton683(index: u32) -> f32 { - const PERM683: [u16; 683] = [0, 427, 256, 128, 555, 64, 491, 363, 192, 619, 320, 32, 459, 288, 160, 587, 96, 523, 395, 224, 651, 16, 443, 272, 144, 571, 80, 507, 379, 208, 635, 347, 48, 475, 304, 176, 603, 112, 539, 411, 240, 667, 336, 8, 435, 264, 136, 563, 72, 499, 371, 200, 627, 328, 40, 467, 296, 168, 595, 104, 531, 403, 232, 659, 24, 451, 280, 152, 579, 88, 515, 387, 216, 643, 355, 56, 483, 312, 184, 611, 120, 547, 419, 248, 675, 4, 431, 260, 132, 559, 68, 495, 367, 196, 623, 324, 36, 463, 292, 164, 591, 100, 527, 399, 228, 655, 20, 447, 276, 148, 575, 84, 511, 383, 212, 639, 351, 52, 479, 308, 180, 607, 116, 543, 415, 244, 671, 343, 12, 439, 268, 140, 567, 76, 503, 375, 204, 631, 332, 44, 471, 300, 172, 599, 108, 535, 407, 236, 663, 28, 455, 284, 156, 583, 92, 519, 391, 220, 647, 359, 60, 487, 316, 188, 615, 124, 551, 423, 252, 679, 340, 2, 429, 258, 130, 557, 66, 493, 365, 194, 621, 322, 34, 461, 290, 162, 589, 98, 525, 397, 226, 653, 18, 445, 274, 146, 573, 82, 509, 381, 210, 637, 349, 50, 477, 306, 178, 605, 114, 541, 413, 242, 669, 338, 10, 437, 266, 138, 565, 74, 501, 373, 202, 629, 330, 42, 469, 298, 170, 597, 106, 533, 405, 234, 661, 26, 453, 282, 154, 581, 90, 517, 389, 218, 645, 357, 58, 485, 314, 186, 613, 122, 549, 421, 250, 677, 6, 433, 262, 134, 561, 70, 497, 369, 198, 625, 326, 38, 465, 294, 166, 593, 102, 529, 401, 230, 657, 22, 449, 278, 150, 577, 86, 513, 385, 214, 641, 353, 54, 481, 310, 182, 609, 118, 545, 417, 246, 673, 345, 14, 441, 270, 142, 569, 78, 505, 377, 206, 633, 334, 46, 473, 302, 174, 601, 110, 537, 409, 238, 665, 30, 457, 286, 158, 585, 94, 521, 393, 222, 649, 361, 62, 489, 318, 190, 617, 126, 553, 425, 254, 681, 341, 1, 428, 257, 129, 556, 65, 492, 364, 193, 620, 321, 33, 460, 289, 161, 588, 97, 524, 396, 225, 652, 17, 444, 273, 145, 572, 81, 508, 380, 209, 636, 348, 49, 476, 305, 177, 604, 113, 540, 412, 241, 668, 337, 9, 436, 265, 137, 564, 73, 500, 372, 201, 628, 329, 41, 468, 297, 169, 596, 105, 532, 404, 233, 660, 25, 452, 281, 153, 580, 89, 516, 388, 217, 644, 356, 57, 484, 313, 185, 612, 121, 548, 420, 249, 676, 5, 432, 261, 133, 560, 69, 496, 368, 197, 624, 325, 37, 464, 293, 165, 592, 101, 528, 400, 229, 656, 21, 448, 277, 149, 576, 85, 512, 384, 213, 640, 352, 53, 480, 309, 181, 608, 117, 544, 416, 245, 672, 344, 13, 440, 269, 141, 568, 77, 504, 376, 205, 632, 333, 45, 472, 301, 173, 600, 109, 536, 408, 237, 664, 29, 456, 285, 157, 584, 93, 520, 392, 221, 648, 360, 61, 488, 317, 189, 616, 125, 552, 424, 253, 680, 342, 3, 430, 259, 131, 558, 67, 494, 366, 195, 622, 323, 35, 462, 291, 163, 590, 99, 526, 398, 227, 654, 19, 446, 275, 147, 574, 83, 510, 382, 211, 638, 350, 51, 478, 307, 179, 606, 115, 542, 414, 243, 670, 339, 11, 438, 267, 139, 566, 75, 502, 374, 203, 630, 331, 43, 470, 299, 171, 598, 107, 534, 406, 235, 662, 27, 454, 283, 155, 582, 91, 518, 390, 219, 646, 358, 59, 486, 315, 187, 614, 123, 550, 422, 251, 678, 7, 434, 263, 135, 562, 71, 498, 370, 199, 626, 327, 39, 466, 295, 167, 594, 103, 530, 402, 231, 658, 23, 450, 279, 151, 578, 87, 514, 386, 215, 642, 354, 55, 482, 311, 183, 610, 119, 546, 418, 247, 674, 346, 15, 442, 271, 143, 570, 79, 506, 378, 207, 634, 335, 47, 474, 303, 175, 602, 111, 538, 410, 239, 666, 31, 458, 287, 159, 586, 95, 522, 394, 223, 650, 362, 63, 490, 319, 191, 618, 127, 554, 426, 255, 682]; - - return (unsafe{*PERM683.get_unchecked((index % 683) as usize)} as u32 * 466489 + - unsafe{*PERM683.get_unchecked(((index / 683) % 683) as usize)} as u32 * 683 + - unsafe{*PERM683.get_unchecked(((index / 466489) % 683) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (318611987u32 as f32)); // Results in [0,1). -} - - -fn halton691(index: u32) -> f32 { - const PERM691: [u16; 691] = [0, 435, 256, 128, 563, 64, 499, 371, 192, 627, 320, 32, 467, 288, 160, 595, 96, 531, 403, 224, 659, 336, 16, 451, 272, 144, 579, 80, 515, 387, 208, 643, 355, 48, 483, 304, 176, 611, 112, 547, 419, 240, 675, 8, 443, 264, 136, 571, 72, 507, 379, 200, 635, 328, 40, 475, 296, 168, 603, 104, 539, 411, 232, 667, 347, 24, 459, 280, 152, 587, 88, 523, 395, 216, 651, 363, 56, 491, 312, 184, 619, 120, 555, 427, 248, 683, 4, 439, 260, 132, 567, 68, 503, 375, 196, 631, 324, 36, 471, 292, 164, 599, 100, 535, 407, 228, 663, 340, 20, 455, 276, 148, 583, 84, 519, 391, 212, 647, 359, 52, 487, 308, 180, 615, 116, 551, 423, 244, 679, 12, 447, 268, 140, 575, 76, 511, 383, 204, 639, 332, 44, 479, 300, 172, 607, 108, 543, 415, 236, 671, 351, 28, 463, 284, 156, 591, 92, 527, 399, 220, 655, 367, 60, 495, 316, 188, 623, 124, 559, 431, 252, 687, 344, 2, 437, 258, 130, 565, 66, 501, 373, 194, 629, 322, 34, 469, 290, 162, 597, 98, 533, 405, 226, 661, 338, 18, 453, 274, 146, 581, 82, 517, 389, 210, 645, 357, 50, 485, 306, 178, 613, 114, 549, 421, 242, 677, 10, 445, 266, 138, 573, 74, 509, 381, 202, 637, 330, 42, 477, 298, 170, 605, 106, 541, 413, 234, 669, 349, 26, 461, 282, 154, 589, 90, 525, 397, 218, 653, 365, 58, 493, 314, 186, 621, 122, 557, 429, 250, 685, 6, 441, 262, 134, 569, 70, 505, 377, 198, 633, 326, 38, 473, 294, 166, 601, 102, 537, 409, 230, 665, 342, 22, 457, 278, 150, 585, 86, 521, 393, 214, 649, 361, 54, 489, 310, 182, 617, 118, 553, 425, 246, 681, 14, 449, 270, 142, 577, 78, 513, 385, 206, 641, 334, 46, 481, 302, 174, 609, 110, 545, 417, 238, 673, 353, 30, 465, 286, 158, 593, 94, 529, 401, 222, 657, 369, 62, 497, 318, 190, 625, 126, 561, 433, 254, 689, 345, 1, 436, 257, 129, 564, 65, 500, 372, 193, 628, 321, 33, 468, 289, 161, 596, 97, 532, 404, 225, 660, 337, 17, 452, 273, 145, 580, 81, 516, 388, 209, 644, 356, 49, 484, 305, 177, 612, 113, 548, 420, 241, 676, 9, 444, 265, 137, 572, 73, 508, 380, 201, 636, 329, 41, 476, 297, 169, 604, 105, 540, 412, 233, 668, 348, 25, 460, 281, 153, 588, 89, 524, 396, 217, 652, 364, 57, 492, 313, 185, 620, 121, 556, 428, 249, 684, 5, 440, 261, 133, 568, 69, 504, 376, 197, 632, 325, 37, 472, 293, 165, 600, 101, 536, 408, 229, 664, 341, 21, 456, 277, 149, 584, 85, 520, 392, 213, 648, 360, 53, 488, 309, 181, 616, 117, 552, 424, 245, 680, 13, 448, 269, 141, 576, 77, 512, 384, 205, 640, 333, 45, 480, 301, 173, 608, 109, 544, 416, 237, 672, 352, 29, 464, 285, 157, 592, 93, 528, 400, 221, 656, 368, 61, 496, 317, 189, 624, 125, 560, 432, 253, 688, 346, 3, 438, 259, 131, 566, 67, 502, 374, 195, 630, 323, 35, 470, 291, 163, 598, 99, 534, 406, 227, 662, 339, 19, 454, 275, 147, 582, 83, 518, 390, 211, 646, 358, 51, 486, 307, 179, 614, 115, 550, 422, 243, 678, 11, 446, 267, 139, 574, 75, 510, 382, 203, 638, 331, 43, 478, 299, 171, 606, 107, 542, 414, 235, 670, 350, 27, 462, 283, 155, 590, 91, 526, 398, 219, 654, 366, 59, 494, 315, 187, 622, 123, 558, 430, 251, 686, 7, 442, 263, 135, 570, 71, 506, 378, 199, 634, 327, 39, 474, 295, 167, 602, 103, 538, 410, 231, 666, 343, 23, 458, 279, 151, 586, 87, 522, 394, 215, 650, 362, 55, 490, 311, 183, 618, 119, 554, 426, 247, 682, 15, 450, 271, 143, 578, 79, 514, 386, 207, 642, 335, 47, 482, 303, 175, 610, 111, 546, 418, 239, 674, 354, 31, 466, 287, 159, 594, 95, 530, 402, 223, 658, 370, 63, 498, 319, 191, 626, 127, 562, 434, 255, 690]; - - return (unsafe{*PERM691.get_unchecked((index % 691) as usize)} as u32 * 477481 + - unsafe{*PERM691.get_unchecked(((index / 691) % 691) as usize)} as u32 * 691 + - unsafe{*PERM691.get_unchecked(((index / 477481) % 691) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (329939371u32 as f32)); // Results in [0,1). -} - - -fn halton701(index: u32) -> f32 { - const PERM701: [u16; 701] = [0, 445, 256, 128, 573, 64, 509, 381, 192, 637, 320, 32, 477, 288, 160, 605, 96, 541, 413, 224, 669, 336, 16, 461, 272, 144, 589, 80, 525, 397, 208, 653, 365, 48, 493, 304, 176, 621, 112, 557, 429, 240, 685, 344, 8, 453, 264, 136, 581, 72, 517, 389, 200, 645, 328, 40, 485, 296, 168, 613, 104, 549, 421, 232, 677, 357, 24, 469, 280, 152, 597, 88, 533, 405, 216, 661, 373, 56, 501, 312, 184, 629, 120, 565, 437, 248, 693, 348, 4, 449, 260, 132, 577, 68, 513, 385, 196, 641, 324, 36, 481, 292, 164, 609, 100, 545, 417, 228, 673, 340, 20, 465, 276, 148, 593, 84, 529, 401, 212, 657, 369, 52, 497, 308, 180, 625, 116, 561, 433, 244, 689, 353, 12, 457, 268, 140, 585, 76, 521, 393, 204, 649, 332, 44, 489, 300, 172, 617, 108, 553, 425, 236, 681, 361, 28, 473, 284, 156, 601, 92, 537, 409, 220, 665, 377, 60, 505, 316, 188, 633, 124, 569, 441, 252, 697, 2, 447, 258, 130, 575, 66, 511, 383, 194, 639, 322, 34, 479, 290, 162, 607, 98, 543, 415, 226, 671, 338, 18, 463, 274, 146, 591, 82, 527, 399, 210, 655, 367, 50, 495, 306, 178, 623, 114, 559, 431, 242, 687, 346, 10, 455, 266, 138, 583, 74, 519, 391, 202, 647, 330, 42, 487, 298, 170, 615, 106, 551, 423, 234, 679, 359, 26, 471, 282, 154, 599, 90, 535, 407, 218, 663, 375, 58, 503, 314, 186, 631, 122, 567, 439, 250, 695, 351, 6, 451, 262, 134, 579, 70, 515, 387, 198, 643, 326, 38, 483, 294, 166, 611, 102, 547, 419, 230, 675, 342, 22, 467, 278, 150, 595, 86, 531, 403, 214, 659, 371, 54, 499, 310, 182, 627, 118, 563, 435, 246, 691, 355, 14, 459, 270, 142, 587, 78, 523, 395, 206, 651, 334, 46, 491, 302, 174, 619, 110, 555, 427, 238, 683, 363, 30, 475, 286, 158, 603, 94, 539, 411, 222, 667, 379, 62, 507, 318, 190, 635, 126, 571, 443, 254, 699, 350, 1, 446, 257, 129, 574, 65, 510, 382, 193, 638, 321, 33, 478, 289, 161, 606, 97, 542, 414, 225, 670, 337, 17, 462, 273, 145, 590, 81, 526, 398, 209, 654, 366, 49, 494, 305, 177, 622, 113, 558, 430, 241, 686, 345, 9, 454, 265, 137, 582, 73, 518, 390, 201, 646, 329, 41, 486, 297, 169, 614, 105, 550, 422, 233, 678, 358, 25, 470, 281, 153, 598, 89, 534, 406, 217, 662, 374, 57, 502, 313, 185, 630, 121, 566, 438, 249, 694, 349, 5, 450, 261, 133, 578, 69, 514, 386, 197, 642, 325, 37, 482, 293, 165, 610, 101, 546, 418, 229, 674, 341, 21, 466, 277, 149, 594, 85, 530, 402, 213, 658, 370, 53, 498, 309, 181, 626, 117, 562, 434, 245, 690, 354, 13, 458, 269, 141, 586, 77, 522, 394, 205, 650, 333, 45, 490, 301, 173, 618, 109, 554, 426, 237, 682, 362, 29, 474, 285, 157, 602, 93, 538, 410, 221, 666, 378, 61, 506, 317, 189, 634, 125, 570, 442, 253, 698, 3, 448, 259, 131, 576, 67, 512, 384, 195, 640, 323, 35, 480, 291, 163, 608, 99, 544, 416, 227, 672, 339, 19, 464, 275, 147, 592, 83, 528, 400, 211, 656, 368, 51, 496, 307, 179, 624, 115, 560, 432, 243, 688, 347, 11, 456, 267, 139, 584, 75, 520, 392, 203, 648, 331, 43, 488, 299, 171, 616, 107, 552, 424, 235, 680, 360, 27, 472, 283, 155, 600, 91, 536, 408, 219, 664, 376, 59, 504, 315, 187, 632, 123, 568, 440, 251, 696, 352, 7, 452, 263, 135, 580, 71, 516, 388, 199, 644, 327, 39, 484, 295, 167, 612, 103, 548, 420, 231, 676, 343, 23, 468, 279, 151, 596, 87, 532, 404, 215, 660, 372, 55, 500, 311, 183, 628, 119, 564, 436, 247, 692, 356, 15, 460, 271, 143, 588, 79, 524, 396, 207, 652, 335, 47, 492, 303, 175, 620, 111, 556, 428, 239, 684, 364, 31, 476, 287, 159, 604, 95, 540, 412, 223, 668, 380, 63, 508, 319, 191, 636, 127, 572, 444, 255, 700]; - - return (unsafe{*PERM701.get_unchecked((index % 701) as usize)} as u32 * 491401 + - unsafe{*PERM701.get_unchecked(((index / 701) % 701) as usize)} as u32 * 701 + - unsafe{*PERM701.get_unchecked(((index / 491401) % 701) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (344472101u32 as f32)); // Results in [0,1). -} - - -fn halton709(index: u32) -> f32 { - const PERM709: [u16; 709] = [0, 453, 256, 128, 581, 320, 64, 517, 389, 192, 645, 32, 485, 288, 160, 613, 357, 96, 549, 421, 224, 677, 16, 469, 272, 144, 597, 336, 80, 533, 405, 208, 661, 48, 501, 304, 176, 629, 373, 112, 565, 437, 240, 693, 8, 461, 264, 136, 589, 328, 72, 525, 397, 200, 653, 40, 493, 296, 168, 621, 365, 104, 557, 429, 232, 685, 24, 477, 280, 152, 605, 344, 88, 541, 413, 216, 669, 56, 509, 312, 184, 637, 381, 120, 573, 445, 248, 701, 352, 4, 457, 260, 132, 585, 324, 68, 521, 393, 196, 649, 36, 489, 292, 164, 617, 361, 100, 553, 425, 228, 681, 20, 473, 276, 148, 601, 340, 84, 537, 409, 212, 665, 52, 505, 308, 180, 633, 377, 116, 569, 441, 244, 697, 12, 465, 268, 140, 593, 332, 76, 529, 401, 204, 657, 44, 497, 300, 172, 625, 369, 108, 561, 433, 236, 689, 28, 481, 284, 156, 609, 348, 92, 545, 417, 220, 673, 60, 513, 316, 188, 641, 385, 124, 577, 449, 252, 705, 2, 455, 258, 130, 583, 322, 66, 519, 391, 194, 647, 34, 487, 290, 162, 615, 359, 98, 551, 423, 226, 679, 18, 471, 274, 146, 599, 338, 82, 535, 407, 210, 663, 50, 503, 306, 178, 631, 375, 114, 567, 439, 242, 695, 10, 463, 266, 138, 591, 330, 74, 527, 399, 202, 655, 42, 495, 298, 170, 623, 367, 106, 559, 431, 234, 687, 26, 479, 282, 154, 607, 346, 90, 543, 415, 218, 671, 58, 511, 314, 186, 639, 383, 122, 575, 447, 250, 703, 355, 6, 459, 262, 134, 587, 326, 70, 523, 395, 198, 651, 38, 491, 294, 166, 619, 363, 102, 555, 427, 230, 683, 22, 475, 278, 150, 603, 342, 86, 539, 411, 214, 667, 54, 507, 310, 182, 635, 379, 118, 571, 443, 246, 699, 14, 467, 270, 142, 595, 334, 78, 531, 403, 206, 659, 46, 499, 302, 174, 627, 371, 110, 563, 435, 238, 691, 30, 483, 286, 158, 611, 350, 94, 547, 419, 222, 675, 62, 515, 318, 190, 643, 387, 126, 579, 451, 254, 707, 354, 1, 454, 257, 129, 582, 321, 65, 518, 390, 193, 646, 33, 486, 289, 161, 614, 358, 97, 550, 422, 225, 678, 17, 470, 273, 145, 598, 337, 81, 534, 406, 209, 662, 49, 502, 305, 177, 630, 374, 113, 566, 438, 241, 694, 9, 462, 265, 137, 590, 329, 73, 526, 398, 201, 654, 41, 494, 297, 169, 622, 366, 105, 558, 430, 233, 686, 25, 478, 281, 153, 606, 345, 89, 542, 414, 217, 670, 57, 510, 313, 185, 638, 382, 121, 574, 446, 249, 702, 353, 5, 458, 261, 133, 586, 325, 69, 522, 394, 197, 650, 37, 490, 293, 165, 618, 362, 101, 554, 426, 229, 682, 21, 474, 277, 149, 602, 341, 85, 538, 410, 213, 666, 53, 506, 309, 181, 634, 378, 117, 570, 442, 245, 698, 13, 466, 269, 141, 594, 333, 77, 530, 402, 205, 658, 45, 498, 301, 173, 626, 370, 109, 562, 434, 237, 690, 29, 482, 285, 157, 610, 349, 93, 546, 418, 221, 674, 61, 514, 317, 189, 642, 386, 125, 578, 450, 253, 706, 3, 456, 259, 131, 584, 323, 67, 520, 392, 195, 648, 35, 488, 291, 163, 616, 360, 99, 552, 424, 227, 680, 19, 472, 275, 147, 600, 339, 83, 536, 408, 211, 664, 51, 504, 307, 179, 632, 376, 115, 568, 440, 243, 696, 11, 464, 267, 139, 592, 331, 75, 528, 400, 203, 656, 43, 496, 299, 171, 624, 368, 107, 560, 432, 235, 688, 27, 480, 283, 155, 608, 347, 91, 544, 416, 219, 672, 59, 512, 315, 187, 640, 384, 123, 576, 448, 251, 704, 356, 7, 460, 263, 135, 588, 327, 71, 524, 396, 199, 652, 39, 492, 295, 167, 620, 364, 103, 556, 428, 231, 684, 23, 476, 279, 151, 604, 343, 87, 540, 412, 215, 668, 55, 508, 311, 183, 636, 380, 119, 572, 444, 247, 700, 15, 468, 271, 143, 596, 335, 79, 532, 404, 207, 660, 47, 500, 303, 175, 628, 372, 111, 564, 436, 239, 692, 31, 484, 287, 159, 612, 351, 95, 548, 420, 223, 676, 63, 516, 319, 191, 644, 388, 127, 580, 452, 255, 708]; - - return (unsafe{*PERM709.get_unchecked((index % 709) as usize)} as u32 * 502681 + - unsafe{*PERM709.get_unchecked(((index / 709) % 709) as usize)} as u32 * 709 + - unsafe{*PERM709.get_unchecked(((index / 502681) % 709) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (356400829u32 as f32)); // Results in [0,1). -} - - -fn halton719(index: u32) -> f32 { - const PERM719: [u16; 719] = [0, 463, 256, 128, 591, 320, 64, 527, 399, 192, 655, 32, 495, 288, 160, 623, 367, 96, 559, 431, 224, 687, 16, 479, 272, 144, 607, 336, 80, 543, 415, 208, 671, 48, 511, 304, 176, 639, 383, 112, 575, 447, 240, 703, 352, 8, 471, 264, 136, 599, 328, 72, 535, 407, 200, 663, 40, 503, 296, 168, 631, 375, 104, 567, 439, 232, 695, 24, 487, 280, 152, 615, 344, 88, 551, 423, 216, 679, 56, 519, 312, 184, 647, 391, 120, 583, 455, 248, 711, 356, 4, 467, 260, 132, 595, 324, 68, 531, 403, 196, 659, 36, 499, 292, 164, 627, 371, 100, 563, 435, 228, 691, 20, 483, 276, 148, 611, 340, 84, 547, 419, 212, 675, 52, 515, 308, 180, 643, 387, 116, 579, 451, 244, 707, 363, 12, 475, 268, 140, 603, 332, 76, 539, 411, 204, 667, 44, 507, 300, 172, 635, 379, 108, 571, 443, 236, 699, 28, 491, 284, 156, 619, 348, 92, 555, 427, 220, 683, 60, 523, 316, 188, 651, 395, 124, 587, 459, 252, 715, 358, 2, 465, 258, 130, 593, 322, 66, 529, 401, 194, 657, 34, 497, 290, 162, 625, 369, 98, 561, 433, 226, 689, 18, 481, 274, 146, 609, 338, 82, 545, 417, 210, 673, 50, 513, 306, 178, 641, 385, 114, 577, 449, 242, 705, 354, 10, 473, 266, 138, 601, 330, 74, 537, 409, 202, 665, 42, 505, 298, 170, 633, 377, 106, 569, 441, 234, 697, 26, 489, 282, 154, 617, 346, 90, 553, 425, 218, 681, 58, 521, 314, 186, 649, 393, 122, 585, 457, 250, 713, 361, 6, 469, 262, 134, 597, 326, 70, 533, 405, 198, 661, 38, 501, 294, 166, 629, 373, 102, 565, 437, 230, 693, 22, 485, 278, 150, 613, 342, 86, 549, 421, 214, 677, 54, 517, 310, 182, 645, 389, 118, 581, 453, 246, 709, 365, 14, 477, 270, 142, 605, 334, 78, 541, 413, 206, 669, 46, 509, 302, 174, 637, 381, 110, 573, 445, 238, 701, 30, 493, 286, 158, 621, 350, 94, 557, 429, 222, 685, 62, 525, 318, 190, 653, 397, 126, 589, 461, 254, 717, 359, 1, 464, 257, 129, 592, 321, 65, 528, 400, 193, 656, 33, 496, 289, 161, 624, 368, 97, 560, 432, 225, 688, 17, 480, 273, 145, 608, 337, 81, 544, 416, 209, 672, 49, 512, 305, 177, 640, 384, 113, 576, 448, 241, 704, 353, 9, 472, 265, 137, 600, 329, 73, 536, 408, 201, 664, 41, 504, 297, 169, 632, 376, 105, 568, 440, 233, 696, 25, 488, 281, 153, 616, 345, 89, 552, 424, 217, 680, 57, 520, 313, 185, 648, 392, 121, 584, 456, 249, 712, 357, 5, 468, 261, 133, 596, 325, 69, 532, 404, 197, 660, 37, 500, 293, 165, 628, 372, 101, 564, 436, 229, 692, 21, 484, 277, 149, 612, 341, 85, 548, 420, 213, 676, 53, 516, 309, 181, 644, 388, 117, 580, 452, 245, 708, 364, 13, 476, 269, 141, 604, 333, 77, 540, 412, 205, 668, 45, 508, 301, 173, 636, 380, 109, 572, 444, 237, 700, 29, 492, 285, 157, 620, 349, 93, 556, 428, 221, 684, 61, 524, 317, 189, 652, 396, 125, 588, 460, 253, 716, 360, 3, 466, 259, 131, 594, 323, 67, 530, 402, 195, 658, 35, 498, 291, 163, 626, 370, 99, 562, 434, 227, 690, 19, 482, 275, 147, 610, 339, 83, 546, 418, 211, 674, 51, 514, 307, 179, 642, 386, 115, 578, 450, 243, 706, 355, 11, 474, 267, 139, 602, 331, 75, 538, 410, 203, 666, 43, 506, 299, 171, 634, 378, 107, 570, 442, 235, 698, 27, 490, 283, 155, 618, 347, 91, 554, 426, 219, 682, 59, 522, 315, 187, 650, 394, 123, 586, 458, 251, 714, 362, 7, 470, 263, 135, 598, 327, 71, 534, 406, 199, 662, 39, 502, 295, 167, 630, 374, 103, 566, 438, 231, 694, 23, 486, 279, 151, 614, 343, 87, 550, 422, 215, 678, 55, 518, 311, 183, 646, 390, 119, 582, 454, 247, 710, 366, 15, 478, 271, 143, 606, 335, 79, 542, 414, 207, 670, 47, 510, 303, 175, 638, 382, 111, 574, 446, 239, 702, 31, 494, 287, 159, 622, 351, 95, 558, 430, 223, 686, 63, 526, 319, 191, 654, 398, 127, 590, 462, 255, 718]; - - return (unsafe{*PERM719.get_unchecked((index % 719) as usize)} as u32 * 516961 + - unsafe{*PERM719.get_unchecked(((index / 719) % 719) as usize)} as u32 * 719 + - unsafe{*PERM719.get_unchecked(((index / 516961) % 719) as usize)} as u32) as f32 * (0.999999940395355224609375f32 / (371694959u32 as f32)); // Results in [0,1). -} - diff --git a/src/sampling/mod.rs b/src/sampling/mod.rs index 7d93d63..2bab45e 100644 --- a/src/sampling/mod.rs +++ b/src/sampling/mod.rs @@ -1,4 +1,3 @@ -pub mod halton; mod monte_carlo; pub use self::monte_carlo::{square_to_circle, cosine_sample_hemisphere, uniform_sample_hemisphere, diff --git a/sub_crates/halton/Cargo.toml b/sub_crates/halton/Cargo.toml new file mode 100644 index 0000000..31a7dbe --- /dev/null +++ b/sub_crates/halton/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "halton" +version = "0.1.0" +authors = ["Nathan Vegdahl "] +license = "MIT" +build = "build.rs" + +[lib] +name = "halton" +path = "src/lib.rs" diff --git a/sub_crates/halton/build.rs b/sub_crates/halton/build.rs new file mode 100644 index 0000000..f5a8d10 --- /dev/null +++ b/sub_crates/halton/build.rs @@ -0,0 +1,272 @@ +// Copyright (c) 2012 Leonhard Gruenschloss (leonhard@gruenschloss.org) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +// of the Software, and to permit persons to whom the Software is furnished to do +// so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +// Adapted to Rust and to generate Rust instead of C by Nathan Vegdahl + +// Generate Rust code for evaluating Halton points with Faure-permutations for different bases. + +use std::env; +use std::fs::File; +use std::io::Write; +use std::path::Path; + + +/// How many components to generate. +const NUM_DIMENSIONS: usize = 128; + +fn main() { + let out_dir = env::var("OUT_DIR").unwrap(); + let dest_path = Path::new(&out_dir).join("halton.rs"); + let mut f = File::create(&dest_path).unwrap(); + + // Init prime number array. + let primes = { + let mut primes = Vec::new(); + let mut candidate = 1; + for _ in 0..NUM_DIMENSIONS { + loop { + candidate += 1; + if is_prime(candidate) { + primes.push(candidate); + break; + } + } + } + primes + }; + + // Init Faure permutations. + let faure = { + let mut faure: Vec> = Vec::new(); + for b in 0..(primes.last().unwrap() + 1) { + let perm = get_faure_permutation(&faure, b); + faure.push(perm); + } + faure + }; + + // Write the beginning bits of the file + f.write_all(format!(r#" +// Copyright (c) 2012 Leonhard Gruenschloss (leonhard@gruenschloss.org) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +// of the Software, and to permit persons to whom the Software is furnished to do +// so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +// This file is automatically generated. + +// Compute points of the Halton sequence with with Faure-permutations for different bases. + +pub const MAX_DIMENSION: u32 = {}; +"#, + NUM_DIMENSIONS) + .as_bytes()) + .unwrap(); + + // Write the sampling function + f.write_all(format!(r#" +#[inline] +pub fn sample(dimension: u32, index: u32) -> f32 {{ + match dimension {{"#) + .as_bytes()) + .unwrap(); + + for i in 0..NUM_DIMENSIONS { + f.write_all(format!(r#" + {} => halton{}(index),"#, + i, + primes[i]) + .as_bytes()) + .unwrap(); + } + + f.write_all(format!(r#" + _ => panic!("Exceeded max dimensions."), + }} +}} + "#) + .as_bytes()) + .unwrap(); + + + // Write the special-cased first dimension + f.write_all(format!(r#" +// Special case: radical inverse in base 2, with direct bit reversal. +fn halton2(mut index: u32) -> f32 {{ + index = (index << 16) | (index >> 16); + index = ((index & 0x00ff00ff) << 8) | ((index & 0xff00ff00) >> 8); + index = ((index & 0x0f0f0f0f) << 4) | ((index & 0xf0f0f0f0) >> 4); + index = ((index & 0x33333333) << 2) | ((index & 0xcccccccc) >> 2); + index = ((index & 0x55555555) << 1) | ((index & 0xaaaaaaaa) >> 1); + return (index as f32) * (1.0 / ((1u64 << 32) as f32)); +}} + "#) + .as_bytes()) + .unwrap(); + + for i in 1..NUM_DIMENSIONS { + // Skip base 2. + let base = primes[i]; + + // Based on the permutation table size, we process multiple digits at once. + let mut digits = 1; + let mut pow_base = base; + while pow_base * base <= 500 { + // Maximum permutation table size. + pow_base *= base; + digits += 1; + } + + let mut max_power = pow_base; + let mut powers = Vec::new(); + while (max_power * pow_base) < (1 << 32) { + // 32-bit unsigned precision + powers.push(max_power); + max_power *= pow_base; + } + + // Build the permutation table. + let perm = (0..pow_base).map(|j| invert(&faure, base, j, digits)).collect::>(); + let perm_string = { + let mut perm_string = String::new(); + for i in perm.iter() { + let s = format!("{}, ", i); + perm_string.push_str(&s); + } + perm_string + }; + + let mut power = max_power / pow_base; + f.write_all(format!(r#" +fn halton{}(index: u32) -> f32 {{ + const PERM{}: [u16; {}] = [{}];"#, + base, + base, + perm.len(), + perm_string) + .as_bytes()) + .unwrap();; + + f.write_all(format!(r#" + return (unsafe{{*PERM{}.get_unchecked((index % {}) as usize)}} as u32 * {} +"#, + base, + pow_base, + power) + .as_bytes()) + .unwrap();; + + // Advance to next set of digits. + let mut div = 1; + while power / pow_base > 1 { + div *= pow_base; + power /= pow_base; + f.write_all(format!(r#" + unsafe{{*PERM{}.get_unchecked(((index / {}) % {}) as usize)}} as u32 * {} +"#, + base, + div, + pow_base, + power) + .as_bytes()) + .unwrap();; + } + + f.write_all(format!(r#" + unsafe{{*PERM{}.get_unchecked(((index / {}) % {}) as usize)}} as u32) as f32 * + (0.999999940395355224609375f32 / ({}u32 as f32)); // Results in [0,1). +}} + "#, + base, + div * pow_base, + pow_base, + max_power) + .as_bytes()) + .unwrap();; + } +} + + +/// Check primality. Not optimized, since it's not performance-critical. +fn is_prime(p: usize) -> bool { + for i in 2..p { + if (p % i) == 0 { + return false; + } + } + return true; +} + +/// Computes the Faure digit permutation for 0, ..., b - 1. +fn get_faure_permutation(faure: &Vec>, b: usize) -> Vec { + if b < 2 { + return vec![0]; + } else if b == 2 { + return vec![0, 1]; + } else if (b & 1) != 0 { + // odd + let c = (b - 1) / 2; + + return (0..b) + .map(|i| { + if i == c { + return c; + } + + let f: usize = faure[b - 1][i - ((i > c) as usize)]; + f + ((f >= c) as usize) + }) + .collect(); + } else { + // even + let c = b / 2; + + return (0..b) + .map(|i| if i < c { + 2 * faure[c][i] + } else { + 2 * faure[c][i - c] + 1 + }) + .collect(); + } +} + +/// Compute the radical inverse with Faure permutations. +fn invert(faure: &Vec>, base: usize, mut index: usize, digits: usize) -> usize { + let mut result = 0; + for _ in 0..digits { + let remainder = index % base; + index = index / base; + result = result * base + faure[base][remainder]; + } + return result; +} diff --git a/sub_crates/halton/src/lib.rs b/sub_crates/halton/src/lib.rs new file mode 100644 index 0000000..2c386d9 --- /dev/null +++ b/sub_crates/halton/src/lib.rs @@ -0,0 +1,4 @@ +#![allow(dead_code)] + +// Include the file generated by the build.rs script +include!(concat!(env!("OUT_DIR"), "/halton.rs")); \ No newline at end of file diff --git a/mem_arena/Cargo.toml b/sub_crates/mem_arena/Cargo.toml similarity index 100% rename from mem_arena/Cargo.toml rename to sub_crates/mem_arena/Cargo.toml diff --git a/mem_arena/src/lib.rs b/sub_crates/mem_arena/src/lib.rs similarity index 100% rename from mem_arena/src/lib.rs rename to sub_crates/mem_arena/src/lib.rs diff --git a/sub_crates/spectra_xyz/Cargo.toml b/sub_crates/spectra_xyz/Cargo.toml new file mode 100644 index 0000000..5aa7df2 --- /dev/null +++ b/sub_crates/spectra_xyz/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "spectra_xyz" +version = "0.1.0" +authors = ["Nathan Vegdahl "] +license = "MIT" + +[lib] +name = "spectra_xyz" +path = "src/lib.rs" diff --git a/src/color/generate_spectra_rust.py b/sub_crates/spectra_xyz/src/generate_spectra_rust.py similarity index 100% rename from src/color/generate_spectra_rust.py rename to sub_crates/spectra_xyz/src/generate_spectra_rust.py diff --git a/src/color/spectra_xyz.rs b/sub_crates/spectra_xyz/src/lib.rs similarity index 100% rename from src/color/spectra_xyz.rs rename to sub_crates/spectra_xyz/src/lib.rs diff --git a/src/color/xyz_5nm_360_830.csv b/sub_crates/spectra_xyz/src/xyz_5nm_360_830.csv similarity index 100% rename from src/color/xyz_5nm_360_830.csv rename to sub_crates/spectra_xyz/src/xyz_5nm_360_830.csv diff --git a/src/color/xyz_5nm_380_780.csv b/sub_crates/spectra_xyz/src/xyz_5nm_380_780.csv similarity index 100% rename from src/color/xyz_5nm_380_780.csv rename to sub_crates/spectra_xyz/src/xyz_5nm_380_780.csv