S(n) = sum_{k=1..n} (-2)^k * C(2k,k) u(n) = v2(3*S(n) + 4) (2-adic valuation) U(N) = sum_{n=1..N} u(n^3), N = 10000. In the 2-adics 3*sum_{k>=1} (-2)^k*C(2k,k) + 4 = 0, so 3*S(n) + 4 = -3 * sum_{k>n} R(k), R(k) = (-2)^k * C(2k,k). -3 is odd, so u(n) = v2( sum_{k>n} R(k) ). R(k+1)/R(k) = -4 * (2k+1)/(k+1), v2(R(k)) = k + popcount(k). We sum the tail k = n+1 .. n+m (m up to 220) keeping only odd parts modulo 2^P (powers of two tracked separately). The remainder for k >= n+m+1 is divisible by 2^(n+m+1), so once the partial sum's valuation drops below n+m+1 it equals u(n). Precision P starts at 256 bits and is doubled when the reduced sum vanishes mod 2^P.
# Project Euler 792: Too Many Twos
# S(n) = sum_{k=1..n} (-2)^k * C(2k,k)
# u(n) = v2(3*S(n) + 4) (2-adic valuation)
# U(N) = sum_{n=1..N} u(n^3), N = 10000.
#
# In the 2-adics 3*sum_{k>=1} (-2)^k*C(2k,k) + 4 = 0, so
# 3*S(n) + 4 = -3 * sum_{k>n} R(k), R(k) = (-2)^k * C(2k,k).
# -3 is odd, so u(n) = v2( sum_{k>n} R(k) ).
#
# R(k+1)/R(k) = -4 * (2k+1)/(k+1), v2(R(k)) = k + popcount(k).
#
# We sum the tail k = n+1 .. n+m (m up to 220) keeping only odd parts
# modulo 2^P (powers of two tracked separately). The remainder for
# k >= n+m+1 is divisible by 2^(n+m+1), so once the partial sum's
# valuation drops below n+m+1 it equals u(n). Precision P starts at
# 256 bits and is doubled when the reduced sum vanishes mod 2^P.
extern {
function calloc(n: i64, size: i64) -> ptr<void>
function malloc(n: i64) -> ptr<void>
function free(p: ptr<void>) -> void
}
const MAXLIMBS: i32 = 32
# ---- helpers: popcount and ctz for u64 ----
function popcount64(x0: u64) -> i64 {
let mut x: u64 = x0
let mut c: i64 = 0
while x != 0 {
c = c + 1
x = x & (x - 1)
}
return c
}
function ctz64(x: u64) -> i32 {
if x == 0 { return 64 }
let mut n: i32 = 0
let mut v: u64 = x
while (v & 1) == 0 {
n = n + 1
v = v >> 1
}
return n
}
# ---- bignum mod 2^(64*nl), little-endian u64 limbs ----
function bn_is_zero(a: ptr<u64>, nl: i32) -> bool {
let mut i: i32 = 0
while i < nl {
if a[i] != 0 { return false }
i = i + 1
}
return true
}
function bn_v2(a: ptr<u64>, nl: i32) -> i32 {
let mut i: i32 = 0
while i < nl {
if a[i] != 0 { return i * 64 + ctz64(a[i]) }
i = i + 1
}
return nl * 64
}
function bn_zero(a: ptr<u64>, nl: i32) -> void {
let mut i: i32 = 0
while i < nl {
a[i] = 0
i = i + 1
}
}
function bn_copy(dst: ptr<u64>, src: ptr<u64>, nl: i32) -> void {
let mut i: i32 = 0
while i < nl {
dst[i] = src[i]
i = i + 1
}
}
function bn_from_u64(a: ptr<u64>, v: u64, nl: i32) -> void {
bn_zero(a, nl)
a[0] = v
}
function bn_from_i64(a: ptr<u64>, v: i64, nl: i32) -> void {
let all_ones: u64 = 0
let fill: u64 = if v < 0 { all_ones - 1 } else { 0 }
let mut i: i32 = 1
while i < nl {
a[i] = fill
i = i + 1
}
a[0] = v as u64
}
function bn_add(dst: ptr<u64>, a: ptr<u64>, b: ptr<u64>, nl: i32) -> void {
let mut carry: u64 = 0
let mut i: i32 = 0
while i < nl {
let s: i128 = (a[i] as i128) + (b[i] as i128) + (carry as i128)
dst[i] = s as u64
carry = (s >> 64) as u64
i = i + 1
}
}
function bn_shl(dst: ptr<u64>, a: ptr<u64>, shift: i32, nl: i32) -> void {
if shift <= 0 { bn_copy(dst, a, nl); return }
if shift >= nl * 64 { bn_zero(dst, nl); return }
let ws: i32 = shift / 64
let bs: i32 = shift % 64
bn_zero(dst, nl)
if bs == 0 {
let mut i: i32 = nl - 1
while i >= ws {
dst[i] = a[i - ws]
i = i - 1
}
} else {
let mut i: i32 = nl - 1
while i >= ws {
let lo: u64 = a[i - ws] << bs
let hi: u64 = if i - ws - 1 >= 0 { a[i - ws - 1] >> (64 - bs) } else { 0 }
dst[i] = lo | hi
i = i - 1
}
}
}
function bn_mul(dst: ptr<u64>, a: ptr<u64>, b: ptr<u64>, nl: i32) -> void {
let tmp: ptr<u64> = calloc(MAXLIMBS as i64, 8) as ptr<u64>
let mut i: i32 = 0
while i < nl {
let mut carry: u64 = 0
let mut j: i32 = 0
while j < nl - i {
let p: i128 = (a[i] as i128) * (b[j] as i128) + (tmp[i + j] as i128) + (carry as i128)
tmp[i + j] = p as u64
carry = (p >> 64) as u64
j = j + 1
}
i = i + 1
}
bn_copy(dst, tmp, nl)
free(tmp as ptr<void>)
}
function bn_inv_odd(dst: ptr<u64>, a: ptr<u64>, nl: i32) -> void {
let x: ptr<u64> = calloc(MAXLIMBS as i64, 8) as ptr<u64>
let t: ptr<u64> = calloc(MAXLIMBS as i64, 8) as ptr<u64>
let two: ptr<u64> = calloc(MAXLIMBS as i64, 8) as ptr<u64>
let ax: ptr<u64> = calloc(MAXLIMBS as i64, 8) as ptr<u64>
let s: ptr<u64> = calloc(MAXLIMBS as i64, 8) as ptr<u64>
let neg: ptr<u64> = calloc(MAXLIMBS as i64, 8) as ptr<u64>
let all_ones: u64 = 0
all_ones = all_ones - 1
bn_from_u64(x, 1, nl)
bn_from_u64(two, 2, nl)
let bits: i32 = nl * 64
let mut it: i32 = 0
while (1 << it) < bits {
bn_mul(ax, a, x, nl)
let mut i: i32 = 0
while i < nl {
neg[i] = all_ones ^ ax[i]
i = i + 1
}
let mut c: u64 = 1
i = 0
while i < nl && c != 0 {
let s2: i128 = (neg[i] as i128) + (c as i128)
neg[i] = s2 as u64
c = (s2 >> 64) as u64
i = i + 1
}
bn_add(s, neg, two, nl)
bn_mul(t, x, s, nl)
bn_copy(x, t, nl)
it = it + 1
}
bn_copy(dst, x, nl)
free(x as ptr<void>)
free(t as ptr<void>)
free(two as ptr<void>)
free(ax as ptr<void>)
free(s as ptr<void>)
free(neg as ptr<void>)
}
# ---- inverse cache (parallel arrays) ----
let mut inv_key: ptr<u64> = null
let mut inv_val: ptr<u64> = null
let mut inv_cache_n: i32 = 0
function inv_odd(denom_odd: u64, nl: i32) -> i32 {
let mut i: i32 = 0
while i < inv_cache_n {
if inv_key[i] == denom_odd { return i }
i = i + 1
}
let a: ptr<u64> = calloc(MAXLIMBS as i64, 8) as ptr<u64>
bn_from_u64(a, denom_odd, nl)
let idx: i32 = inv_cache_n
bn_inv_odd(inv_val + (idx as i64 * MAXLIMBS as i64), a, nl)
inv_key[idx] = denom_odd
inv_cache_n = inv_cache_n + 1
free(a as ptr<void>)
return idx
}
# ---- core: u(n) ----
function u_of(n: i64) -> i64 {
let P_list: ptr<i32> = calloc(4, 4) as ptr<i32>
P_list[0] = 256; P_list[1] = 512; P_list[2] = 1024; P_list[3] = 2048
let odd: ptr<u64> = calloc(MAXLIMBS as i64, 8) as ptr<u64>
let scaled_sum: ptr<u64> = calloc(MAXLIMBS as i64, 8) as ptr<u64>
let tmp: ptr<u64> = calloc(MAXLIMBS as i64, 8) as ptr<u64>
let tmp2: ptr<u64> = calloc(MAXLIMBS as i64, 8) as ptr<u64>
let odd_new: ptr<u64> = calloc(MAXLIMBS as i64, 8) as ptr<u64>
let factor: ptr<u64> = calloc(MAXLIMBS as i64, 8) as ptr<u64>
let mut pi: i32 = 0
while pi < 4 {
let P: i32 = P_list[pi]
let nl: i32 = P / 64
inv_cache_n = 0
let mut k: i64 = n + 1
let mut exp: i64 = k + popcount64(k as u64)
bn_from_u64(odd, 1, nl)
let mut have_min: bool = false
let mut min_exp: i64 = 0
bn_zero(scaled_sum, nl)
let mut m: i32 = 1
while m <= 220 {
if !have_min {
min_exp = exp
bn_copy(scaled_sum, odd, nl)
have_min = true
} else {
if exp < min_exp {
let shift: i64 = min_exp - exp
if shift < (P as i64) { bn_shl(scaled_sum, scaled_sum, shift as i32, nl) }
else { bn_zero(scaled_sum, nl) }
min_exp = exp
bn_add(scaled_sum, scaled_sum, odd, nl)
} else {
let shift: i64 = exp - min_exp
if shift < (P as i64) {
bn_shl(tmp, odd, shift as i32, nl)
bn_add(scaled_sum, scaled_sum, tmp, nl)
}
}
}
if bn_is_zero(scaled_sum, nl) { break }
let v_partial: i64 = min_exp + (bn_v2(scaled_sum, nl) as i64)
if v_partial < n + (m as i64) + 1 {
free(P_list as ptr<void>)
free(odd as ptr<void>)
free(scaled_sum as ptr<void>)
free(tmp as ptr<void>)
free(tmp2 as ptr<void>)
free(odd_new as ptr<void>)
free(factor as ptr<void>)
return v_partial
}
# advance R(k) -> R(k+1): ratio = -4*(2k+1)/(k+1)
let denom: i64 = k + 1
let t: i32 = ctz64(denom as u64)
let denom_odd: u64 = (denom as u64) >> t
let inv_idx: i32 = inv_odd(denom_odd, nl)
let inv_ptr: ptr<u64> = inv_val + (inv_idx as i64 * MAXLIMBS as i64)
bn_from_i64(factor, -(2 * k + 1), nl)
bn_mul(tmp2, factor, inv_ptr, nl)
bn_mul(odd_new, odd, tmp2, nl)
bn_copy(odd, odd_new, nl)
exp = exp + 2 - (t as i64)
k = denom
if exp != k + popcount64(k as u64) {
free(P_list as ptr<void>)
free(odd as ptr<void>)
free(scaled_sum as ptr<void>)
free(tmp as ptr<void>)
free(tmp2 as ptr<void>)
free(odd_new as ptr<void>)
free(factor as ptr<void>)
return -1
}
m = m + 1
}
pi = pi + 1
}
free(P_list as ptr<void>)
free(odd as ptr<void>)
free(scaled_sum as ptr<void>)
free(tmp as ptr<void>)
free(tmp2 as ptr<void>)
free(odd_new as ptr<void>)
free(factor as ptr<void>)
return -1
}
function main() -> i32 {
inv_key = calloc(256, 8) as ptr<u64>
inv_val = calloc(256 * MAXLIMBS as i64, 8) as ptr<u64>
let mut total: i64 = 0
let mut n: i64 = 1
while n <= 10000 {
let nc: i64 = n * n * n
total = total + u_of(nc)
n = n + 1
}
printf("%lld\n", total)
free(inv_key as ptr<void>)
free(inv_val as ptr<void>)
return 0
}
Generated C
#include <stdint.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* Flow runtime helpers */
typedef struct flow_temp_node { struct flow_temp_node* next; } flow_temp_node;
static flow_temp_node* flow_temp_head = NULL;
static int flow_temp_atexit_set = 0;
__attribute__((unused)) static void flow_temp_free_all(void) {
while (flow_temp_head) {
flow_temp_node* n = flow_temp_head;
flow_temp_head = n->next;
free(n);
}
}
__attribute__((unused)) static void* flow_temp_alloc(size_t nbytes) {
flow_temp_node* node = (flow_temp_node*)malloc(sizeof(flow_temp_node) + nbytes);
if (!node) return NULL;
node->next = flow_temp_head;
flow_temp_head = node;
if (!flow_temp_atexit_set) {
flow_temp_atexit_set = 1;
atexit(flow_temp_free_all);
}
return (void*)(node + 1);
}
#ifndef FLOW_DIAG
#define FLOW_DIAG(msg) fprintf(stderr, "%s", (msg))
#endif
#ifndef FLOW_LOG
#define FLOW_LOG(fmt, ...) printf(fmt, __VA_ARGS__)
#endif
#ifndef FLOW_LOG_EMPTY
#define FLOW_LOG_EMPTY(fmt) printf(fmt)
#endif
static char* flow_strcat(const char* a, const char* b) {
size_t la = strlen(a ? a : ""), lb = strlen(b ? b : "");
char* r = (char*)flow_temp_alloc(la + lb + 1);
if (!r) return NULL;
if (la) memcpy(r, a, la);
if (lb) memcpy(r + la, b, lb);
r[la + lb] = '\0';
return r;
}
#define __flow_in_arr(arr, val) __extension__ ({ \
int _found = 0; \
size_t _n = sizeof(arr)/sizeof((arr)[0]); \
for (size_t _i = 0; _i < _n; _i++) { \
if ((arr)[_i] == (val)) { _found = 1; break; } \
} _found; })
/* Unified fault handler (MISRA #279) — override with -DFLOW_FAULT_HANDLER=fn */
#ifndef FLOW_FAULT_HANDLER
__attribute__((unused)) static inline void flow_fault_handler(const char* msg) {
fprintf(stderr, "flow: %s\n", msg ? msg : "fault");
abort();
#if defined(__GNUC__) || defined(__clang__)
__builtin_unreachable();
#endif
}
#else
#define flow_fault_handler FLOW_FAULT_HANDLER
#endif
#define flow_div_by_zero_handler() flow_fault_handler("division by zero")
#define flow_shift_ub_handler() flow_fault_handler("invalid shift (amount out of range or left-shift of negative)")
#ifndef FLOW_CHECKED_DIV
#define FLOW_CHECKED_DIV(L, R) (((R) != 0) ? ((L) / (R)) : (flow_div_by_zero_handler(), (L) * 0))
#endif
#ifndef FLOW_CHECKED_MOD
#define FLOW_CHECKED_MOD(L, R) (((R) != 0) ? ((L) % (R)) : (flow_div_by_zero_handler(), (L) * 0))
#endif
#ifndef FLOW_CHECKED_SHL
#define FLOW_CHECKED_SHL(L, R) ((((R) >= 0) && ((unsigned long long)(R) < (sizeof(L) * 8ull)) && ((L) >= 0)) ? ((L) << (R)) : (flow_shift_ub_handler(), (L) * 0))
#endif
#ifndef FLOW_CHECKED_SHR
#define FLOW_CHECKED_SHR(L, R) ((((R) >= 0) && ((unsigned long long)(R) < (sizeof(L) * 8ull))) ? ((L) >> (R)) : (flow_shift_ub_handler(), (L) * 0))
#endif
#include <math.h>
void* _ui_state = NULL;
static inline float i32_to_f32(int32_t v) { return (float)v; }
/* Host stub for @gpu kernels (device codegen replaces this). */
static inline int32_t gpu_thread_id(void) { return 0; }
int64_t popcount64_u64(uint64_t x0);
int32_t ctz64_u64(uint64_t x);
bool bn_is_zero_ptr_u64_i32(uint64_t* a, int32_t nl);
int32_t bn_v2_ptr_u64_i32(uint64_t* a, int32_t nl);
void bn_zero_ptr_u64_i32(uint64_t* a, int32_t nl);
void bn_copy_ptr_u64_ptr_u64_i32(uint64_t* dst, uint64_t* src, int32_t nl);
void bn_from_u64_ptr_u64_u64_i32(uint64_t* a, uint64_t v, int32_t nl);
void bn_from_i64_ptr_u64_i64_i32(uint64_t* a, int64_t v, int32_t nl);
void bn_add_ptr_u64_ptr_u64_ptr_u64_i32(uint64_t* dst, uint64_t* a, uint64_t* b, int32_t nl);
void bn_shl_ptr_u64_ptr_u64_i32_i32(uint64_t* dst, uint64_t* a, int32_t shift, int32_t nl);
void bn_mul_ptr_u64_ptr_u64_ptr_u64_i32(uint64_t* dst, uint64_t* a, uint64_t* b, int32_t nl);
void bn_inv_odd_ptr_u64_ptr_u64_i32(uint64_t* dst, uint64_t* a, int32_t nl);
int32_t inv_odd_u64_i32(uint64_t denom_odd, int32_t nl);
int64_t u_of_i64(int64_t n);
int32_t main(void);
static const int32_t MAXLIMBS = 32;
/* Module statics */
static uint64_t* inv_key = NULL;
static uint64_t* inv_val = NULL;
static int32_t inv_cache_n = 0;
int64_t popcount64_u64(uint64_t x0) {
uint64_t x = x0;
int64_t c = 0;
while (x != 0) {
c = (c + 1);
x = (x & (x - 1));
}
return c;
}
int32_t ctz64_u64(uint64_t x) {
if (x == 0) {
return 64;
}
int32_t n = 0;
uint64_t v = x;
while ((v & 1) == 0) {
n = (n + 1);
v = FLOW_CHECKED_SHR((v), (1));
}
return n;
}
bool bn_is_zero_ptr_u64_i32(uint64_t* a, int32_t nl) {
int32_t i = 0;
while (i < nl) {
if (a[i] != 0) {
return 0;
}
i = (i + 1);
}
return 1;
}
int32_t bn_v2_ptr_u64_i32(uint64_t* a, int32_t nl) {
int32_t i = 0;
while (i < nl) {
if (a[i] != 0) {
return ((i * 64) + ctz64_u64(a[i]));
}
i = (i + 1);
}
return (nl * 64);
}
void bn_zero_ptr_u64_i32(uint64_t* a, int32_t nl) {
int32_t i = 0;
while (i < nl) {
a[i] = 0;
i = (i + 1);
}
}
void bn_copy_ptr_u64_ptr_u64_i32(uint64_t* dst, uint64_t* src, int32_t nl) {
int32_t i = 0;
while (i < nl) {
dst[i] = src[i];
i = (i + 1);
}
}
void bn_from_u64_ptr_u64_u64_i32(uint64_t* a, uint64_t v, int32_t nl) {
bn_zero_ptr_u64_i32(a, nl);
a[0] = v;
}
void bn_from_i64_ptr_u64_i64_i32(uint64_t* a, int64_t v, int32_t nl) {
uint64_t all_ones = 0;
uint64_t fill = ((v < 0) ? ((all_ones - 1)) : (0));
int32_t i = 1;
while (i < nl) {
a[i] = fill;
i = (i + 1);
}
a[0] = ((uint64_t)(v));
}
void bn_add_ptr_u64_ptr_u64_ptr_u64_i32(uint64_t* dst, uint64_t* a, uint64_t* b, int32_t nl) {
uint64_t carry = 0;
int32_t i = 0;
while (i < nl) {
__int128 s = ((((__int128)(a[i])) + ((__int128)(b[i]))) + ((__int128)(carry)));
dst[i] = ((uint64_t)(s));
carry = ((uint64_t)(FLOW_CHECKED_SHR((s), (64))));
i = (i + 1);
}
}
void bn_shl_ptr_u64_ptr_u64_i32_i32(uint64_t* dst, uint64_t* a, int32_t shift, int32_t nl) {
if (shift <= 0) {
bn_copy_ptr_u64_ptr_u64_i32(dst, a, nl);
return;
}
if (shift >= (nl * 64)) {
bn_zero_ptr_u64_i32(dst, nl);
return;
}
int32_t ws = FLOW_CHECKED_DIV((shift), (64));
int32_t bs = FLOW_CHECKED_MOD((shift), (64));
bn_zero_ptr_u64_i32(dst, nl);
if (bs == 0) {
int32_t i = (nl - 1);
while (i >= ws) {
dst[i] = a[(i - ws)];
i = (i - 1);
}
} else {
int32_t i = (nl - 1);
while (i >= ws) {
uint64_t lo = FLOW_CHECKED_SHL((a[(i - ws)]), (bs));
uint64_t hi = ((((i - ws) - 1) >= 0) ? (FLOW_CHECKED_SHR((a[((i - ws) - 1)]), ((64 - bs)))) : (0));
dst[i] = (lo | hi);
i = (i - 1);
}
}
}
void bn_mul_ptr_u64_ptr_u64_ptr_u64_i32(uint64_t* dst, uint64_t* a, uint64_t* b, int32_t nl) {
uint64_t* tmp = (uint64_t*)(((uint64_t*)(calloc(((int64_t)(MAXLIMBS)), 8))));
int32_t i = 0;
while (i < nl) {
uint64_t carry = 0;
int32_t j = 0;
while (j < (nl - i)) {
__int128 p = (((((__int128)(a[i])) * ((__int128)(b[j]))) + ((__int128)(tmp[(i + j)]))) + ((__int128)(carry)));
tmp[(i + j)] = ((uint64_t)(p));
carry = ((uint64_t)(FLOW_CHECKED_SHR((p), (64))));
j = (j + 1);
}
i = (i + 1);
}
bn_copy_ptr_u64_ptr_u64_i32(dst, tmp, nl);
free(((void*)(tmp)));
}
void bn_inv_odd_ptr_u64_ptr_u64_i32(uint64_t* dst, uint64_t* a, int32_t nl) {
uint64_t* x = (uint64_t*)(((uint64_t*)(calloc(((int64_t)(MAXLIMBS)), 8))));
uint64_t* t = (uint64_t*)(((uint64_t*)(calloc(((int64_t)(MAXLIMBS)), 8))));
uint64_t* two = (uint64_t*)(((uint64_t*)(calloc(((int64_t)(MAXLIMBS)), 8))));
uint64_t* ax = (uint64_t*)(((uint64_t*)(calloc(((int64_t)(MAXLIMBS)), 8))));
uint64_t* s = (uint64_t*)(((uint64_t*)(calloc(((int64_t)(MAXLIMBS)), 8))));
uint64_t* neg = (uint64_t*)(((uint64_t*)(calloc(((int64_t)(MAXLIMBS)), 8))));
uint64_t all_ones = 0;
all_ones = (all_ones - 1);
bn_from_u64_ptr_u64_u64_i32(x, 1, nl);
bn_from_u64_ptr_u64_u64_i32(two, 2, nl);
int32_t bits = (nl * 64);
int32_t it = 0;
while (FLOW_CHECKED_SHL((1), (it)) < bits) {
bn_mul_ptr_u64_ptr_u64_ptr_u64_i32(ax, a, x, nl);
int32_t i = 0;
while (i < nl) {
neg[i] = (all_ones ^ ax[i]);
i = (i + 1);
}
uint64_t c = 1;
i = 0;
while ((i < nl && c != 0)) {
__int128 s2 = (((__int128)(neg[i])) + ((__int128)(c)));
neg[i] = ((uint64_t)(s2));
c = ((uint64_t)(FLOW_CHECKED_SHR((s2), (64))));
i = (i + 1);
}
bn_add_ptr_u64_ptr_u64_ptr_u64_i32(s, neg, two, nl);
bn_mul_ptr_u64_ptr_u64_ptr_u64_i32(t, x, s, nl);
bn_copy_ptr_u64_ptr_u64_i32(x, t, nl);
it = (it + 1);
}
bn_copy_ptr_u64_ptr_u64_i32(dst, x, nl);
free(((void*)(x)));
free(((void*)(t)));
free(((void*)(two)));
free(((void*)(ax)));
free(((void*)(s)));
free(((void*)(neg)));
}
int32_t inv_odd_u64_i32(uint64_t denom_odd, int32_t nl) {
int32_t i = 0;
while (i < inv_cache_n) {
if (inv_key[i] == denom_odd) {
return i;
}
i = (i + 1);
}
uint64_t* a = (uint64_t*)(((uint64_t*)(calloc(((int64_t)(MAXLIMBS)), 8))));
bn_from_u64_ptr_u64_u64_i32(a, denom_odd, nl);
int32_t idx = inv_cache_n;
bn_inv_odd_ptr_u64_ptr_u64_i32((inv_val + (((int64_t)(idx)) * ((int64_t)(MAXLIMBS)))), a, nl);
inv_key[idx] = denom_odd;
inv_cache_n = (inv_cache_n + 1);
free(((void*)(a)));
return idx;
}
int64_t u_of_i64(int64_t n) {
int32_t* P_list = (int32_t*)(((int32_t*)(calloc(4, 4))));
P_list[0] = 256;
P_list[1] = 512;
P_list[2] = 1024;
P_list[3] = 2048;
uint64_t* odd = (uint64_t*)(((uint64_t*)(calloc(((int64_t)(MAXLIMBS)), 8))));
uint64_t* scaled_sum = (uint64_t*)(((uint64_t*)(calloc(((int64_t)(MAXLIMBS)), 8))));
uint64_t* tmp = (uint64_t*)(((uint64_t*)(calloc(((int64_t)(MAXLIMBS)), 8))));
uint64_t* tmp2 = (uint64_t*)(((uint64_t*)(calloc(((int64_t)(MAXLIMBS)), 8))));
uint64_t* odd_new = (uint64_t*)(((uint64_t*)(calloc(((int64_t)(MAXLIMBS)), 8))));
uint64_t* factor = (uint64_t*)(((uint64_t*)(calloc(((int64_t)(MAXLIMBS)), 8))));
int32_t pi = 0;
while (pi < 4) {
int32_t P = P_list[pi];
int32_t nl = FLOW_CHECKED_DIV((P), (64));
inv_cache_n = 0;
int64_t k = (n + 1);
int64_t exp = (k + popcount64_u64(((uint64_t)(k))));
bn_from_u64_ptr_u64_u64_i32(odd, 1, nl);
bool have_min = 0;
int64_t min_exp = 0;
bn_zero_ptr_u64_i32(scaled_sum, nl);
int32_t m = 1;
while (m <= 220) {
if ((!(have_min))) {
min_exp = exp;
bn_copy_ptr_u64_ptr_u64_i32(scaled_sum, odd, nl);
have_min = 1;
} else {
if (exp < min_exp) {
int64_t shift = (min_exp - exp);
if (shift < ((int64_t)(P))) {
bn_shl_ptr_u64_ptr_u64_i32_i32(scaled_sum, scaled_sum, ((int32_t)(shift)), nl);
} else {
bn_zero_ptr_u64_i32(scaled_sum, nl);
}
min_exp = exp;
bn_add_ptr_u64_ptr_u64_ptr_u64_i32(scaled_sum, scaled_sum, odd, nl);
} else {
int64_t shift = (exp - min_exp);
if (shift < ((int64_t)(P))) {
bn_shl_ptr_u64_ptr_u64_i32_i32(tmp, odd, ((int32_t)(shift)), nl);
bn_add_ptr_u64_ptr_u64_ptr_u64_i32(scaled_sum, scaled_sum, tmp, nl);
}
}
}
if (bn_is_zero_ptr_u64_i32(scaled_sum, nl)) {
break;
}
int64_t v_partial = (min_exp + ((int64_t)(bn_v2_ptr_u64_i32(scaled_sum, nl))));
if (v_partial < ((n + ((int64_t)(m))) + 1)) {
free(((void*)(P_list)));
free(((void*)(odd)));
free(((void*)(scaled_sum)));
free(((void*)(tmp)));
free(((void*)(tmp2)));
free(((void*)(odd_new)));
free(((void*)(factor)));
return v_partial;
}
int64_t denom = (k + 1);
int32_t t = ctz64_u64(((uint64_t)(denom)));
uint64_t denom_odd = FLOW_CHECKED_SHR((((uint64_t)(denom))), (t));
int32_t inv_idx = inv_odd_u64_i32(denom_odd, nl);
uint64_t* inv_ptr = (uint64_t*)((inv_val + (((int64_t)(inv_idx)) * ((int64_t)(MAXLIMBS)))));
bn_from_i64_ptr_u64_i64_i32(factor, (-((2 * k) + 1)), nl);
bn_mul_ptr_u64_ptr_u64_ptr_u64_i32(tmp2, factor, inv_ptr, nl);
bn_mul_ptr_u64_ptr_u64_ptr_u64_i32(odd_new, odd, tmp2, nl);
bn_copy_ptr_u64_ptr_u64_i32(odd, odd_new, nl);
exp = ((exp + 2) - ((int64_t)(t)));
k = denom;
if (exp != (k + popcount64_u64(((uint64_t)(k))))) {
free(((void*)(P_list)));
free(((void*)(odd)));
free(((void*)(scaled_sum)));
free(((void*)(tmp)));
free(((void*)(tmp2)));
free(((void*)(odd_new)));
free(((void*)(factor)));
return (-1);
}
m = (m + 1);
}
pi = (pi + 1);
}
free(((void*)(P_list)));
free(((void*)(odd)));
free(((void*)(scaled_sum)));
free(((void*)(tmp)));
free(((void*)(tmp2)));
free(((void*)(odd_new)));
free(((void*)(factor)));
return (-1);
}
int32_t main(void) {
inv_key = ((uint64_t*)(calloc(256, 8)));
inv_val = ((uint64_t*)(calloc((256 * ((int64_t)(MAXLIMBS))), 8)));
int64_t total = 0;
int64_t n = 1;
while (n <= 10000) {
int64_t nc = ((n * n) * n);
total = (total + u_of_i64(nc));
n = (n + 1);
}
printf("%lld\n", total);
free(((void*)(inv_key)));
free(((void*)(inv_val)));
return 0;
}