Skip to content

Instantly share code, notes, and snippets.

@vyuh
Last active May 14, 2022 11:33
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vyuh/8e2c74f49a97a9ade738d58c5151a1c0 to your computer and use it in GitHub Desktop.
Save vyuh/8e2c74f49a97a9ade738d58c5151a1c0 to your computer and use it in GitHub Desktop.
Tried to brute force a tricky real sequence. termux on redmi 4 hangs on (yoo 5). lol
(define (yoo n)
(cond
( (= n 0) (intxdx 0 1))
( ( = n 1) (intxdx (intxdx 0 (/ 1 2)) (intxdx (/ 1 2) 1)))
( else
(let
((N (expt 2 n)))
(intxdx
(calcdown N (/ N 2))
(calcup N (/ N 2)))))))
(define (intxdx low up)
;; (display "yo\n")
(exact->inexact (/ (* (+ low up) (- up low)) 2)))
(define (calcup pow2n i)
(if (= (+ 1 i) pow2n)
(intxdx (/ i pow2n) 1)
(intxdx
(/ i pow2n)
(intxdx
(/ (+ i 1) pow2n)
(calcup pow2n (+ i 1))))))
(define (calcdown pow2n i)
(if (= i 1)
(intxdx 0 (/ 1 pow2n))
(intxdx
(intxdx
(calcdown pow2n (- i 1))
(/ (- i 1) pow2n))
(/ i pow2n))))
(define (ell n) (/ (log (/ 0.25 (abs (yoo n)))) (log 2)))
(define (lim n) (- (ell n) (+ 4 n)))
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
double intxdx(double low, double up) {
return (low+up)*(up-low)/2;
}
double calcup(unsigned n) {
double POW2N = pow(2.0, n);
double i = POW2N;
double up = 1.0;
double down;
while (i > 1 + POW2N/2) {
down = (i-1.0)/POW2N;
up = intxdx(down, up);
up = intxdx(down, up);
i = i - 1;
}
down = 0.5;
up = intxdx(down, up);
return up;
}
double calcdown(unsigned n) {
double POW2N = pow(2.0, n);
double i = 0;
double down = 0.0;
double up;
while (i + 1 < POW2N/2) {
up = (i+1.0)/POW2N;
down = intxdx(down, up);
down = intxdx(down, up);
i = i + 1;
}
up = 0.5;
down = intxdx(down, up);
return down;
}
double yoo(unsigned n) {
switch(n) {
case 0: return intxdx(0, 1);
case 1: return intxdx(intxdx(0, 0.5), intxdx(0.5, 1));
default: return intxdx(calcdown(n), calcup(n));
}
}
double ell(unsigned n) {
return log(0.25/fabs(yoo(n)))/log(2);
}
int main(int argc, char **argv) {
int n = 0, i = 0;
if (argc > 1) {
n = atoi(argv[1]);
}
if (n == 0) {
n = 21;
}
for (i = 0; i <= n; i++ ) {
printf( "%4d\t%4.16f\n", i, ell(i) );
}
return 0;
}
/*
compile using: `cc a_tricky_real_sequence.c -o trickyseq -lm`
run using: `./trickyseq 30`
*/
import math
def yoo(n):
if n == 0:
return intxdx(0,1)
elif n == 1:
return intxdx(intxdx(0, 0.5), intxdx(0.5, 1))
else:
return intxdx(calcdown(n), calcup(n))
def intxdx(low, up):
return (low+up)*(up-low)/2.0
def calcup(n):
POW2N = 2.0**n
i = POW2N
up = 1.0
while i > 1 + POW2N/2:
down = (i-1.0)/POW2N
up = intxdx(down, up)
up = intxdx(down, up)
i = i - 1
down = 0.5
up = intxdx(down, up)
return up
def calcdown(n):
POW2N = 2.0**n
i = 0
down = 0.0
while i < POW2N/2 -1:
up = (i+1.0)/POW2N
down = intxdx(down, up)
down = intxdx(down, up)
i = i + 1
up = 0.5
down = intxdx(down, up)
return down
def ell(n):
return math.log2(1.0/(4*abs(yoo(n))))
if __name__ == '__main__':
for i in range(21):
print(i, ell(i))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment