Skip to content

Commit 9483c88

Browse files
committed
new file: Math/binomial_real.sf
1 parent f897784 commit 9483c88

File tree

3 files changed

+29
-1
lines changed

3 files changed

+29
-1
lines changed

Math/binomial_real.sf

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#!/usr/bin/ruby
2+
3+
# Compute binomial(n,k) as a floating-point value, for arbitrary large n and k.
4+
5+
func binomial_real(n,k) {
6+
local Num!PREC = max(2*int(log2(n+2)), 192)
7+
exp(lgamma(n+1) - (lgamma(k+1) + lgamma(n - k + 1)))
8+
}
9+
10+
say binomial(100!, 100).f #=> 1.07241237505844504438047039025154993084902991441e15639
11+
say binomial_real(100!, 100) #=> 1.07241237505844504438047039025154993084902991441e15639

Math/sum_of_prime_powers.sf

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ f(n) = if(n <= 1, return(0)); my(r=sqrtint(n)); my(V=vector(r, k, n\k)); my(L=n\
1212
g(n, j=2) = if(n <= 1, return(0)); my(r=sqrtint(n)); my(V=vector(r, k, n\k)); my(F(n, j)=(subst(bernpol(j+1), x, n+1) - subst(bernpol(j+1), x, 1)) / (j+1)); my(L=n\r-1); V=concat(V, vector(L, k, L-k+1)); my(T=vector(#V, k, F(V[k], j))); my(S=Map(matrix(#V, 2, x, y, if(y==1, V[x], T[x])))); forprime(p=2, r, my(sp=mapget(S, p-1), p2=p*p); for(k=1, #V, if(V[k] < p2, break); mapput(S, V[k], mapget(S, V[k]) - p^j*(mapget(S, V[k]\p) - sp)))); mapget(S, n)-1;
1313
a(n) = my(s=0); forprime(p=2, sqrtnint(n,3), s += (p^(logint(n, p)+1) - 1)/(p-1) - p*p - p - 1); f(n) + g(sqrtint(n)) + s;
1414
b(n) = my(s=0); forprime(p=2, sqrtint(n), s += (p^(logint(n, p)+1) - 1)/(p-1) - p - 1); f(n) + s;
15+
c(n) = sum(k=1, logint(n,2), g(sqrtnint(n,k), k));
1516

1617
)
1718

@@ -62,10 +63,25 @@ func sum_of_prime_powers(n) {
6263
ps1 + ps2 + ps3
6364
}
6465

66+
func sum_of_prime_powers_2(n) {
67+
68+
# a(n) = Sum_{k=1..floor(log_2(n))} Sum_{p prime <= n^(1/k)} p^k.
69+
70+
sum(1..n.ilog2, {|k|
71+
sum_of_primes(n.iroot(k), k)
72+
})
73+
}
74+
6575
say sum_of_prime_powers(1e5) #=> 457028152
6676
say sum_of_prime_powers(43**3) #=> 294752679
6777

6878
for k in (1..100) {
6979
var n = 1e3.irand
70-
assert_eq(sum_of_prime_powers(n), n.prime_powers.sum)
80+
81+
var x = sum_of_prime_powers(n)
82+
var y = sum_of_prime_powers_2(n)
83+
var z = n.prime_powers.sum
84+
85+
assert_eq(x,y)
86+
assert_eq(x,z)
7187
}

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,7 @@ A nice collection of day-to-day Sidef scripts.
160160
* [Bi-unitary divisors](./Math/bi-unitary_divisors.sf)
161161
* [Binary exponentiation](./Math/binary_exponentiation.sf)
162162
* [Binary gcd algorithm](./Math/binary_gcd_algorithm.sf)
163+
* [Binomial real](./Math/binomial_real.sf)
163164
* [Binomial theorem](./Math/binomial_theorem.sf)
164165
* [Binomial transform](./Math/binomial_transform.sf)
165166
* [Bisected hypotenuse](./Math/bisected_hypotenuse.sf)

0 commit comments

Comments
 (0)