Partition_Mikael
To download the codes, please visit our
GitHub repository.
Please note that testing a too big size of number could exceed acceptable computation time for online IDEs.
So we recommend you to test the codes in your personal computer environment by installing an IDE.
* Thank you to SageMath for offering an online IDE.
Hardy-Ramanujan-Rademacher formula
* Thank you to JDoodle for offering an online IDE.
Partition Function, Σps(m,2) ver.
C
C++
#include
#include
long first2terms(long N);
long from_3rd_term = 0;
long A(long n, long k);
long B(long n, long k);
long C(long n);
long D(long n);
int main(void) {
auto N = 120; // Please input a natural number "N" for P(N) at here.
auto start = std::chrono::steady_clock::now();
long n = N-6, k, partition;
if(N>=0 && N-(int)N == 0){
for(n; n>=0; n-=2){
k=3+((N-6)-n)/2;
A(n,k);
}
partition = first2terms(N) + from_3rd_term;
std::cout << partition << '\n';
auto end = std::chrono::steady_clock::now();
auto diff = end - start;
std::cout << "running time: "
<< std::chrono::duration(diff).count() << " seconds" << '\n';
}
else{
std::cout << "undefined" << '\n';
}
return 0;
}
long first2terms(long N){
if(N==0){
return 1;
}
else{
long secondterm = 0;
if(N%2==1){
secondterm += ((N-3)/2)*((N-3)/2)+((N-3)/2);
}
else{
secondterm += (N/2-1)*(N/2-1);
}
return N + secondterm;
}
}
long A(long n, long k){
if(n>=k && k>=3){
return C(n) + A(n-k, k) + B(n,k);
}
else if(n>=3 && n3){
k--;
A(n-k,k);
}
return 0;
}
long C(long n){
from_3rd_term += D(n);
return from_3rd_term;
}
long D(long n){
long result = 0;
if(n%2==1){
result += ((n+1)/2)*((n+1)/2)+((n+1)/2);
}
else{
result += (n/2+1)*(n/2+1);
}
return result;
}
Python
import timeit
timer_start = timeit.default_timer()
N = 100 # Please input a natural number "N" for P(N) at here.
try:
def first2terms(N):
if N == 0:
return 1
else:
if N % 2 == 1:
secondterm = ((N-3)/2)*((N-3)/2)+((N-3)/2)
else:
secondterm = (N/2-1)*(N/2-1)
return N + secondterm
def from_3rd_term(N):
n = N-6
result = 0
for n in range(n, -1, -2):
k = 3+((N-6)-n)/2
result += A(n, k)
return result
def A(n, k):
if n >= k and k >= 3:
return C(n) + A(n-k, k) + B(n, k)
elif n >= 3 and n < k:
k = n
return C(n) + A(n-k, k) + B(n, k)
else:
return C(n)
def B(n, k):
send_back = 0
while k > 3:
k -= 1
send_back += A(n-k, k)
return send_back
def C(n):
c_result = 0
c_result += D(n)
return c_result
def D(n):
if n % 2 == 1:
return ((n+1)/2)*((n+1)/2)+((n+1)/2)
else:
return (n/2+1)*(n/2+1)
partition = int(first2terms(N) + from_3rd_term(N))
timer_stop = timeit.default_timer()
running_time = round(timer_stop - timer_start, 6)
if __name__ == '__main__':
print(partition, "\n" "running time: ",
running_time, " seconds") if N >= 0 else print("undefined")
except:
print("undefined")
JavaScript (Node.js)
let N = 120 // Please input a natural number "N" for P(N) at here.
let startTime = performance.now()
if (N >= 0 && N - parseInt(N) == 0) {
function first2terms(N) {
if (N == 0) {
return 1;
}
else {
let secondterm;
if (N % 2 == 1) {
secondterm = ((N - 3) / 2) * ((N - 3) / 2) + (N - 3) / 2;
} else {
secondterm = (N / 2 - 1) * (N / 2 - 1);
}
return N + secondterm;
}
}
function from_3rd_term(N) {
let n = N - 6;
let result = 0;
for (n; n >= 0; n -= 2) {
let k = 3 + (N - 6 - n) / 2;
result += A(n, k);
}
return result;
}
function A(n, k) {
if (n >= k && k >= 3) {
return C(n) + A(n - k, k) + B(n, k);
} else if (n >= 3 && n < k) {
k = n;
return C(n) + A(n - k, k) + B(n, k);
} else {
return C(n);
}
}
function B(n, k) {
let send_back = 0;
while (k > 3) {
k--;
send_back += A(n - k, k);
}
return send_back;
}
function C(n) {
let c_result = 0;
c_result += D(n);
return c_result;
}
function D(n) {
let result = 0;
if (n % 2 == 1) {
result += ((n + 1) / 2) * ((n + 1) / 2) + (n + 1) / 2;
} else {
result += (n / 2 + 1) * (n / 2 + 1);
}
return result;
}
let partition = first2terms(N) + from_3rd_term(N);
console.log(partition);
let endTime = performance.now();
let duration = ((endTime - startTime) / 1000).toFixed(6);
console.log(`running time: ${duration} seconds`);
}
else {
console.log("undefined")
}
Java
public class partition_mikael {
public static void main(String[] args) {
long N = 150; // Please input a natural number "N" for P(N) at here.
if (N >= 0) {
long startTime = System.nanoTime();
long partition = first2terms(N) + expansion.from_3rd_term(N);
long endTime = System.nanoTime();
long totalTime = (endTime - startTime) / 1000000000;
System.out.println(partition);
System.out.println(totalTime + "seconds");
} else {
System.out.println("undefined");
}
}
static long first2terms(long N) {
if (N == 0) {
return 1;
} else {
long second_term = 0;
if (N % 2 == 1) {
second_term += ((N - 3) / 2) * ((N - 3) / 2) + ((N - 3) / 2);
} else {
second_term += (N / 2 - 1) * (N / 2 - 1);
}
return N + second_term;
}
}
}
class expansion {
static long from_3rd_term(long N) {
long result = 0;
for (long n = N - 6; n >= 0; n -= 2) {
long k = 3 + ((N - 6) - n) / 2;
result += A(n, k);
}
return result;
}
private static long A(long n, long k) {
if (n >= k && k >= 3) {
return C(n) + A(n - k, k) + B(n, k);
} else if (n >= 3 && n < k) {
k = n;
return C(n) + A(n - k, k) + B(n, k);
} else {
return C(n);
}
}
private static long B(long n, long k) {
long send_back = 0;
while (k > 3) {
k--;
send_back += A(n - k, k);
}
return send_back;
}
private static long C(long n) {
long c_result = 0;
c_result += D(n);
return c_result;
}
private static long D(long n) {
long result = 0;
if (n % 2 == 1) {
result += ((n + 1) / 2) * ((n + 1) / 2) + ((n + 1) / 2);
} else {
result += (n / 2 + 1) * (n / 2 + 1);
}
return result;
}
}
C#
using System;
namespace Partition
{
class I
{
public static void Main()
{
long N = 120; // Please input a natural number "N" for P(N) at here.
if (N >= 0)
{
var watch = System.Diagnostics.Stopwatch.StartNew();
long partition = I.first2terms(N) + II.from_3rd_term(N);
watch.Stop();
var elapsedMs = (watch.ElapsedMilliseconds) / 1000;
Console.WriteLine(partition);
Console.WriteLine(elapsedMs + "seconds");
}
else
{
Console.WriteLine("undefined");
}
}
private static long first2terms(long N)
{
if (N == 0)
{
return 1;
}
else
{
long secondterm = 0;
if (N % 2 == 1)
{
secondterm += ((N - 3) / 2) * ((N - 3) / 2) + ((N - 3) / 2);
}
else
{
secondterm += (N / 2 - 1) * (N / 2 - 1);
}
return N + secondterm;
}
}
}
class II
{
internal static long from_3rd_term(long N)
{
long result = 0;
for (long n = N - 6; n >= 0; n -= 2)
{
long k = 3 + ((N - 6) - n) / 2;
result += A(n, k);
}
return result;
}
private static long A(long n, long k)
{
if (n >= k && k >= 3)
{
return C(n) + A(n - k, k) + B(n, k);
}
else if (n >= 3 && n < k)
{
k = n;
return C(n) + A(n - k, k) + B(n, k);
}
else
{
return C(n);
}
}
private static long B(long n, long k)
{
long send_back = 0;
while (k > 3)
{
k--;
send_back += A(n - k, k);
}
return send_back;
}
private static long C(long n)
{
long c_result = 0;
c_result += D(n);
return c_result;
}
private static long D(long n)
{
long result = 0;
if (n % 2 == 1)
{
result += ((n + 1) / 2) * ((n + 1) / 2) + ((n + 1) / 2);
}
else
{
result += (n / 2 + 1) * (n / 2 + 1);
}
return result;
}
}
}
revised_C
#include
#include
long first2terms(long N);
long from_3rd_term = 0;
long expansion(long n, long k);
int main(void) {
double N = 150; // Please input a natural number "N" for P(N) at here.
clock_t start, end;
double running_time;
start = clock();
long n = N-6, k, partition;
if(N>=0 && N-(int)N == 0){
for(n; n>=0; n-=2){
k=3+((N-6)-n)/2;
expansion(n,k);
}
partition = first2terms(N) + from_3rd_term;
printf("%ld\n",partition);
end = clock();
running_time = ((double)(end - start))/CLOCKS_PER_SEC;
printf("%s%lf%s\n", "running time: ", running_time, " seconds");
}
else{
printf("%s\n", "undefined");
}
return 0;
}
long first2terms(long N){
if(N==0){
return 1;
}
else{
long secondterm = 0;
if(N%2==1){
secondterm += ((N-3)/2)*((N-3)/2)+((N-3)/2);
}
else{
secondterm += (N/2-1)*(N/2-1);
}
return N + secondterm;
}
}
long expansion(long n, long k){
if(n>=k && k>=3){
for(k; k>=3; k--)expansion(n-k,k);}
else if(n>=3 && n=3; k--)expansion(n-k,k);}
else{}
if(n%2==1){
from_3rd_term += ((n+1)/2)*((n+1)/2)+((n+1)/2);
}
else{
from_3rd_term += (n/2+1)*(n/2+1);
}
return from_3rd_term;
}
revised_C++
#include
#include
long first2terms(long N);
long from_3rd_term = 0;
long expansion(long n, long k);
int main(void) {
auto N = 150; // Please input a natural number "N" for P(N) at here.
auto start = std::chrono::steady_clock::now();
long n = N-6, k, partition;
if(N>=0 && N-(int)N == 0){
for(n; n>=0; n-=2){
k=3+((N-6)-n)/2;
expansion(n,k);
}
partition = first2terms(N) + from_3rd_term;
std::cout << partition << '\n';
auto end = std::chrono::steady_clock::now();
auto diff = end - start;
std::cout << "running time: "
<< std::chrono::duration(diff).count() << " seconds" << '\n';
}
else{
std::cout << "undefined" << '\n';
}
return 0;
}
long first2terms(long N){
if(N==0){
return 1;
}
else{
long secondterm = 0;
if(N%2==1){
secondterm += ((N-3)/2)*((N-3)/2)+((N-3)/2);
}
else{
secondterm += (N/2-1)*(N/2-1);
}
return N + secondterm;
}
}
long expansion(long n, long k){
if(n>=k && k>=3){
for(k; k>=3; k--)expansion(n-k,k);}
else if(n>=3 && n=3; k--)expansion(n-k,k);}
else{}
if(n%2==1){
from_3rd_term += ((n+1)/2)*((n+1)/2)+((n+1)/2);
}
else{
from_3rd_term += (n/2+1)*(n/2+1);
}
return from_3rd_term;
}
Partition Function, Σps(m,3) ver.
C++
#include
#include
long first2terms(long N);
long from_3rd_term = 0;
long A(long n, long k);
long B(long n, long k);
long C(long n);
long D(long n);
int main(void) {
auto N = 150; // Please input a natural number "N" for P(N) at here.
auto start = std::chrono::steady_clock::now();
long n = N-6, k, partition;
if(N>=0 && N-(int)N == 0){
for(n; n>=0; n-=2){
k=3+((N-6)-n)/2;
A(n,k);
}
partition = first2terms(N) + from_3rd_term;
std::cout << partition << '\n';
auto end = std::chrono::steady_clock::now();
auto diff = end - start;
std::cout << "running time: "
<< std::chrono::duration(diff).count() << " seconds" << '\n';
}
else{
std::cout << "undefined" << '\n';
}
return 0;
}
long first2terms(long N){
if(N==0){
return 1;
}
else{
long secondterm = 0;
if(N%2==1){
secondterm += ((N-3)/2)*((N-3)/2)+((N-3)/2);
}
else{
secondterm += (N/2-1)*(N/2-1);
}
return N + secondterm;
}
}
long A(long n, long k){
if(n>=k && k>=4){
return C(n) + A(n-k, k) + B(n,k);
}
else if(n>=4 && n4){
k--;
A(n-k,k);
}
return 0;
}
long C(long n){
from_3rd_term += D(n);
return from_3rd_term;
}
long D(long n){
double result = 0, a;
if(n%6==1){
a = (n-1)/6;
from_3rd_term += 6*a*a*a+(27*a*a)/2+(19*a)/2+2;
}
else if(n%6==2){
a = (n-2)/6;
from_3rd_term += 6*a*a*a+(33*a*a)/2+(29*a)/2+4;
}
else if(n%6==3){
a = (n-3)/6;
from_3rd_term += 6*a*a*a+(39*a*a)/2+(41*a)/2+7;
}
else if(n%6==4){
a = (n-4)/6;
from_3rd_term += 6*a*a*a+(45*a*a)/2+(55*a)/2+11;
}
else if(n%6==5){
a = (n-5)/6;
from_3rd_term += 6*a*a*a+(51*a*a)/2+(71*a)/2+16;
}
else {
a = n/6;
from_3rd_term += 6*a*a*a+(21*a*a)/2+(11*a)/2+1;
}
return result;
}
revised_C++
#include
#include
long first2terms(long N);
long from_3rd_term = 0;
long expansion(long n, long k);
int main(void) {
auto N = 150; // Please input a natural number "N" for P(N) at here.
auto start = std::chrono::steady_clock::now();
long n = N-6, k, partition;
if(N>=0 && N-(int)N == 0){
for(n; n>=0; n-=2){
k=3+((N-6)-n)/2;
expansion(n,k);
}
partition = first2terms(N) + from_3rd_term;
std::cout << partition << '\n';
auto end = std::chrono::steady_clock::now();
auto diff = end - start;
std::cout << "running time: "
<< std::chrono::duration(diff).count() << " seconds" << '\n';
}
else{
std::cout << "undefined" << '\n';
}
return 0;
}
long first2terms(long N){
if(N==0){
return 1;
}
else{
long secondterm = 0;
if(N%2==1){
secondterm += ((N-3)/2)*((N-3)/2)+((N-3)/2);
}
else{
secondterm += (N/2-1)*(N/2-1);
}
return N + secondterm;
}
}
long expansion(long n, long k){
if(n>=k && k>=4){
for(k; k>=4; k--)expansion(n-k,k);}
else if(n>=4 && n=4; k--)expansion(n-k,k);}
else{}
double a;
if(n%6==1){
a = (n-1)/6;
from_3rd_term += 6*a*a*a+(27*a*a)/2+(19*a)/2+2;
}
else if(n%6==2){
a = (n-2)/6;
from_3rd_term += 6*a*a*a+(33*a*a)/2+(29*a)/2+4;
}
else if(n%6==3){
a = (n-3)/6;
from_3rd_term += 6*a*a*a+(39*a*a)/2+(41*a)/2+7;
}
else if(n%6==4){
a = (n-4)/6;
from_3rd_term += 6*a*a*a+(45*a*a)/2+(55*a)/2+11;
}
else if(n%6==5){
a = (n-5)/6;
from_3rd_term += 6*a*a*a+(51*a*a)/2+(71*a)/2+16;
}
else {
a = n/6;
from_3rd_term += 6*a*a*a+(21*a*a)/2+(11*a)/2+1;
}
return from_3rd_term;
}
JavaScript (Node.js)
let N = 150 // Please input a natural number "N" for P(N) at here.
let startTime = performance.now();
if (N >= 0 && N - parseInt(N) == 0) {
function first2terms(N) {
if (N == 0) {
return 1;
}
else {
let secondterm;
if (N % 2 == 1) {
secondterm = ((N - 3) / 2) * ((N - 3) / 2) + (N - 3) / 2;
} else {
secondterm = (N / 2 - 1) * (N / 2 - 1);
}
return N + secondterm;
}
}
function from_3rd_term(N) {
let n = N - 6;
let result = 0;
for (n; n >= 0; n -= 2) {
let k = 3 + (N - 6 - n) / 2;
result += A(n, k);
}
return result;
}
function A(n, k) {
if (n >= k && k >= 4) {
return C(n) + A(n - k, k) + B(n, k);
} else if (n >= 4 && n < k) {
k = n;
return C(n) + A(n - k, k) + B(n, k);
} else {
return C(n);
}
}
function B(n, k) {
let send_back = 0;
while (k > 4) {
k--;
send_back += A(n - k, k);
}
return send_back;
}
function C(n) {
let c_result = 0;
c_result += D(n);
return c_result;
}
function D(n) {
let result = 0, a;
if (n % 6 == 1) {
a = (n - 1) / 6;
result += 6 * a * a * a + (27 * a * a) / 2 + (19 * a) / 2 + 2;
} else if (n % 6 == 2) {
a = (n - 2) / 6;
result += 6 * a * a * a + (33 * a * a) / 2 + (29 * a) / 2 + 4;
} else if (n % 6 == 3) {
a = (n - 3) / 6;
result += 6 * a * a * a + (39 * a * a) / 2 + (41 * a) / 2 + 7;
} else if (n % 6 == 4) {
a = (n - 4) / 6;
result += 6 * a * a * a + (45 * a * a) / 2 + (55 * a) / 2 + 11;
} else if (n % 6 == 5) {
a = (n - 5) / 6;
result += 6 * a * a * a + (51 * a * a) / 2 + (71 * a) / 2 + 16;
} else {
a = n / 6;
result += 6 * a * a * a + (21 * a * a) / 2 + (11 * a) / 2 + 1;
}
return result;
}
let partition = first2terms(N) + from_3rd_term(N);
console.log(partition);
let endTime = performance.now();
let duration = ((endTime - startTime) / 1000).toFixed(6);
console.log(`running time: ${duration} seconds`);
}
else {
console.log("undefined");
}
Partition by Size Function, ps(n,2) ver.
Python
import timeit
timer_start = timeit.default_timer()
(n,k) = (50,40)
# Please input (n,k) for the ps(n,k) function above here.
# Note that when k=n, then ps(n,k) = P(n) holds,
# where P(n) is the partition function.
if(n-int(n) == 0 and k-int(k) == 0 and n >=0 and k >= 0):
def partition_by_size(n, k):
m=n
result = 0
if n>=k and k>0:
for n in range(n-1, n-k-1, -1):
k=m-n
if k == 1:
result += 1
else:
result += A(n,k)
return result
elif k>n and n != 0 and k>0:
k=n
for n in range(n-1, n-k-1, -1):
k=m-n
if k == 1:
result += 1
else:
result += A(n,k)
return result
else:
return 1
def A(n, k):
if n >= k and k >= 3:
return C(n) + A(n-k, k) + B(n, k)
elif n >= 3 and n < k:
k = n
return C(n) + A(n-k, k) + B(n, k)
else:
return C(n)
def B(n, k):
send_back = 0
while k > 3:
k -= 1
send_back += A(n-k, k)
return send_back
def C(n):
c_result = 0
c_result += D(n)
return c_result
def D(n):
if n % 2 == 1:
return (n+1)/2
else:
return (n/2)+1
ps_function = int(partition_by_size(n, k))
timer_stop = timeit.default_timer()
running_time = round(timer_stop - timer_start, 6)
if __name__ == '__main__':
print("ps(n,k): ", ps_function, "\n" "running time: ",
running_time, " seconds")
else:
print("undefined")
Java
public class partition_by_size {
public static void main(String[] args) {
long n = 100, k = 50;
/*
Please input (n,k) for the ps(n,k) function above here.
Note that when k>=n, then ps(n,k) = P(n) holds,
where P(n) is the partition function.
*/
if (n >= 0 && k >= 0) {
long startTime = System.nanoTime();
long result = expansion(n, k);
long endTime = System.nanoTime();
long totalTime = (endTime - startTime) / 1000000000;
System.out.println(result);
System.out.println(totalTime + "seconds");
} else {
System.out.println("undefined");
}
}
private static long expansion(long n, long k) {
long m = n, lower_limit = n - k, result = 0;
if (n >= k && k > 0) {
for (n -= 1; n >= lower_limit; n -= 1) {
k = m - n;
if (k == 1) {
result += 1;
} else {
result += A(n, k);
}
}
return result;
} else if (k > n && n != 0 && k > 0) {
k = n;
lower_limit = n - k;
for (n -= 1; n >= lower_limit; n -= 1) {
k = m - n;
if (k == 1) {
result += 1;
} else {
result += A(n, k);
}
}
return result;
} else {
return 1;
}
}
private static long A(long n, long k) {
if (n >= k && k >= 3) {
return C(n) + A(n - k, k) + B(n, k);
} else if (n >= 3 && n < k) {
k = n;
return C(n) + A(n - k, k) + B(n, k);
} else {
return C(n);
}
}
private static long B(long n, long k) {
long send_back = 0;
while (k > 3) {
k--;
send_back += A(n - k, k);
}
return send_back;
}
private static long C(long n) {
long c_result = 0;
c_result += D(n);
return c_result;
}
private static long D(long n) {
long result = 0;
if (n % 2 == 1) {
result += (n + 1) / 2;
} else {
result += (n / 2) + 1;
}
return result;
}
}
JavaScript (Node.js)
let [n, k] = [100, 50];
/*
Please input [n,k] for the ps(n,k) function above here.
Note that when k>=n, then ps(n,k) = P(n) holds,
where P(n) is the partition function.
*/
let startTime = performance.now();
if (n - parseInt(n) == 0 && k - parseInt(k) == 0 && n >= 0 && k >= 0) {
function partition_by_size(n, k) {
let m = n;
let lowerlimit = n - k;
let result = 0;
if (n >= k && k > 0) {
for (n -= 1; n >= lowerlimit; n -= 1) {
k = m - n;
if (k == 1) {result += 1;}
else {result += A(n, k);}
}
return result;
}
else if (k > n && n != 0 && k > 0) {
k = n, lowerlimit = n - k;
for (n -= 1; n >= lowerlimit; n -= 1) {
k = m - n;
if (k == 1) {result += 1;}
else {result += A(n, k);}
}
return result;
}
else {
return 1;
}
}
function A(n, k) {
if (n >= k && k >= 3) {
return C(n) + A(n - k, k) + B(n, k);
}
else if (n >= 3 && n < k) {
k = n;
return C(n) + A(n - k, k) + B(n, k);
}
else {
return C(n);
}
}
function B(n, k) {
let send_back = 0;
while (k > 3) {
k--;
send_back += A(n - k, k);
}
return send_back;
}
function C(n) {
let c_result = 0;
c_result += D(n);
return c_result;
}
function D(n) {
let result = 0;
if (n % 2 == 1) {
result += (n + 1) / 2;
} else {
result += (n / 2) + 1;
}
return result;
}
let ps_function = partition_by_size(n, k);
console.log(ps_function);
let endTime = performance.now();
let duration = ((endTime - startTime) / 1000).toFixed(6);
console.log(`running time: ${duration} seconds`);
}
else {
console.log("undefined");
}
revised_C
#include
#include
long result = 0;
long expansionI(long n, long k);
long expansionII(long n, long k);
int main(void) {
double n = 100, k = 50;
/*
Please input (n,k) for the ps(n,k) function above here.
Note that when k>=n, then ps(n,k) = P(n) holds,
where P(n) is the partition function.
*/
clock_t start, end;
double running_time;
start = clock();
if (n-(int)n == 0 && k-(int)k == 0 && n >= 0 && k >= 0){
expansionI(n,k);
printf("%ld\n", result);
end = clock();
running_time = ((double)(end - start))/CLOCKS_PER_SEC;
printf("%s%lf%s\n", "running time: ", running_time, " seconds");
}
else{
printf("%s\n", "undefined");
}
return 0;
}
long expansionI(long n, long k){
if (n >= k && k > 0) {
long m=n, limitlength = n-k;
for(n-=1; n>=limitlength; n-=1){
k=m-n;
if (k == 1) {result += 1;}
else {expansionII(n,k);}
}
}
else if (k > n && n != 0 && k != 0) {
long m=n, k=n, limitlength = n-k;
for(n-=1; n>=limitlength; n-=1){
k=m-n;
if (k == 1) {result += 1;}
else {expansionII(n,k);}
}
}
else {
return result += 1;
}
return 0;
}
long expansionII(long n, long k){
if(n>=k && k>=3){
for(k; k>=3; k--)expansionII(n-k,k);}
else if(n>=3 && n=3; k--)expansionII(n-k,k);}
else{}
if(n%2==1){
result += (n+1)/2;
}
else{
result += (n/2)+1;
}
return result;
}
revised_C++
#include
#include
long result = 0;
long expansionI(long n, long k);
long expansionII(long n, long k);
int main(void) {
double n = 100, k = 50;
/*
Please input (n,k) for the ps(n,k) function above here.
Note that when k>=n, then ps(n,k) = P(n) holds,
where P(n) is the partition function.
*/
auto start = std::chrono::steady_clock::now();
if (n-(int)n == 0 && k-(int)k == 0 && n >= 0 && k >= 0){
expansionI(n,k);
std::cout << result << '\n';
auto end = std::chrono::steady_clock::now();
auto diff = end - start;
std::cout << "running time: "
<< std::chrono::duration(diff).count()
<< " seconds" << '\n';
}
else{
std::cout << "undefined" << '\n';
}
return 0;
}
long expansionI(long n, long k){
if (n >= k && k > 0) {
long m=n, limitlength = n-k;
for(n-=1; n>=limitlength; n-=1){
k=m-n;
if (k == 1) {result += 1;}
else{expansionII(n,k);}
}
}
else if (k > n && n != 0 && k != 0) {
long m=n, k=n, limitlength = n-k;
for(n-=1; n>=limitlength; n-=1){
k=m-n;
if (k == 1) {result += 1;}
else{expansionII(n,k);}
}
}
else {
return result += 1;
}
return 0;
}
long expansionII(long n, long k){
if(n>=k && k>=3){
for(k; k>=3; k--)expansionII(n-k,k);}
else if(n>=3 && n=3; k--)expansionII(n-k,k);}
else{}
if(n%2==1){
result += (n+1)/2;
}
else{
result += (n/2)+1;
}
return result;
}
Partition by Size Function, ps(n,3) ver.
Java
public class partition_by_size_m_3 {
public static void main(String[] args) {
long n = 100, k = 50;
/*
Please input (n,k) for the ps(n,k) function above here.
Note that when k>=n, then ps(n,k) = P(n) holds,
where P(n) is the partition function.
*/
if (n >= 0 && k >= 0) {
long startTime = System.nanoTime();
long result = expansion(n, k);
long endTime = System.nanoTime();
long totalTime = (endTime - startTime) / 1000000000;
System.out.println(result);
System.out.println(totalTime + "seconds");
} else {
System.out.println("undefined");
}
}
private static long expansion(long n, long k) {
long m = n, lower_limit = n - k, result = 0;
if (n >= k && k > 0) {
for (n -= 1; n >= lower_limit; n -= 1) {
k = m - n;
if (k == 1) {
result += 1;
} else if (k == 2) {
if (n % 2 == 1) {
result += (n + 1) / 2;
} else {
result += (n / 2) + 1;
}
} else {
result += A(n, k);
}
}
return result;
} else if (k > n && n != 0 && k > 0) {
k = n;
lower_limit = n - k;
for (n -= 1; n >= lower_limit; n -= 1) {
k = m - n;
if (k == 1) {
result += 1;
} else if (k == 2) {
if (n % 2 == 1) {
result += (n + 1) / 2;
} else {
result += (n / 2) + 1;
}
} else {
result += A(n, k);
}
}
return result;
} else {
return 1;
}
}
private static long A(long n, long k) {
if (n >= k && k >= 4) {
return C(n) + A(n - k, k) + B(n, k);
} else if (n >= 4 && n < k) {
k = n;
return C(n) + A(n - k, k) + B(n, k);
} else {
return C(n);
}
}
private static long B(long n, long k) {
long send_back = 0;
while (k > 4) {
k--;
send_back += A(n - k, k);
}
return send_back;
}
private static long C(long n) {
long c_result = 0;
c_result += D(n);
return c_result;
}
private static double D(long n) {
long result = 0, a;
if (n % 6 == 1) {
a = (n - 1) / 6;
result += 3 * a * a + 4 * a + 1;
} else if (n % 6 == 2) {
a = (n - 2) / 6;
result += 3 * a * a + 5 * a + 2;
} else if (n % 6 == 3) {
a = (n - 3) / 6;
result += 3 * a * a + 6 * a + 3;
} else if (n % 6 == 4) {
a = (n - 4) / 6;
result += 3 * a * a + 7 * a + 4;
} else if (n % 6 == 5) {
a = (n - 5) / 6;
result += 3 * a * a + 8 * a + 5;
} else {
a = n / 6;
result += 3 * a * a + 3 * a + 1;
}
return result;
}
}
JavaScript (Node.js)
let [n, k] = [100, 50];
/*
Please input [n,k] for the ps(n,k) function above here.
Note that when k>=n, then ps(n,k) = P(n),
where P(n) is the partition function.
*/
let startTime = performance.now();
if (n - parseInt(n) == 0 && k - parseInt(k) == 0 && n >= 0 && k >= 0) {
function partition_by_size(n, k) {
let m = n;
let lowerlimit = n - k;
let result = 0;
if (n >= k && k > 0) {
for (n -= 1; n >= lowerlimit; n -= 1) {
k = m - n;
if (k == 1) {result += 1;}
else if (k == 2) {
if (n % 2 == 1) {
result += (n + 1) / 2;
} else {
result += (n / 2) + 1;
}
}
else {result += A(n, k);}
}
return result;
}
else if (k > n && n != 0 && k > 0) {
k = n, lowerlimit = n - k;
for (n -= 1; n >= lowerlimit; n -= 1) {
k = m - n;
if (k == 1) {result += 1;}
else if (k == 2) {
if (n % 2 == 1) {
result += (n + 1) / 2;
} else {
result += (n / 2) + 1;
}
}
else {result += A(n, k);}
}
return result;
}
else {
return 1;
}
}
function A(n, k) {
if (n >= k && k >= 4) {
return C(n) + A(n - k, k) + B(n, k);
}
else if (n >= 4 && n < k) {
k = n;
return C(n) + A(n - k, k) + B(n, k);
}
else {
return C(n);
}
}
function B(n, k) {
let send_back = 0;
while (k > 4) {
k--;
send_back += A(n - k, k);
}
return send_back;
}
function C(n) {
let c_result = 0;
c_result += D(n);
return c_result;
}
function D(n) {
let result = 0, a;
if (n % 6 == 1) {
a = (n - 1) / 6;
result += 3 * a * a + 4 * a + 1;
} else if (n % 6 == 2) {
a = (n - 2) / 6;
result += 3 * a * a + 5 * a + 2;
} else if (n % 6 == 3) {
a = (n - 3) / 6;
result += 3 * a * a + 6 * a + 3;
} else if (n % 6 == 4) {
a = (n - 4) / 6;
result += 3 * a * a + 7 * a + 4;
} else if (n % 6 == 5) {
a = (n - 5) / 6;
result += 3 * a * a + 8 * a + 5;
} else {
a = n / 6;
result += 3 * a * a + 3 * a + 1;
}
return result;
}
let ps_function = partition_by_size(n, k);
console.log(ps_function);
let endTime = performance.now();
let duration = ((endTime - startTime) / 1000).toFixed(6);
console.log(`running time: ${duration} seconds`);
}
else {
console.log("undefined");
}
revised_C
#include
#include
long result = 0;
long expansionI(long n, long k);
long expansionII(long n, long k);
int main(void) {
double n = 100, k = 50;
/*
Please input (n,k) for the ps(n,k) function above here.
Note that when k>=n, then ps(n,k) = P(n) holds,
where P(n) is the partition function.
*/
clock_t start, end;
double running_time;
start = clock();
if (n-(int)n == 0 && k-(int)k == 0 && n >= 0 && k >= 0){
expansionI(n,k);
printf("%ld\n", result);
end = clock();
running_time = ((double)(end - start))/CLOCKS_PER_SEC;
printf("%s%lf%s\n", "running time: ", running_time, " seconds");
}
else{
printf("%s\n", "undefined");
}
return 0;
}
long expansionI(long n, long k){
if (n >= k && k > 0) {
long m=n, limitlength = n-k;
for(n-=1; n>=limitlength; n-=1){
k=m-n;
if (k == 1){result += 1;}
else if (k == 2){
if (n % 2 == 1) {
result += (n+1) / 2;
} else {
result += (n/2) + 1;
}
}
else{expansionII(n,k);}
}
}
else if (k > n && n != 0 && k != 0) {
long m=n, k=n, limitlength = n-k;
for(n-=1; n>=limitlength; n-=1){
k=m-n;
if (k == 1){result += 1;}
else if (k == 2){
if (n % 2 == 1) {
result += (n+1) / 2;
} else {
result += (n/2) + 1;
}
}
else{expansionII(n,k);}
}
}
else {
return result += 1;
}
return 0;
}
long expansionII(long n, long k){
if(n>=k && k>=4){
for(k; k>=4; k--)expansionII(n-k,k);}
else if(n>=4 && n=4; k--)expansionII(n-k,k);}
else{}
long a;
if (n % 6 == 1) {
a = (n - 1) / 6;
result += 3*a*a + 4*a + 1;
} else if (n % 6 == 2) {
a = (n - 2) / 6;
result += 3*a*a + 5*a + 2;
} else if (n % 6 == 3) {
a = (n - 3) / 6;
result += 3*a*a + 6*a + 3;
} else if (n % 6 == 4) {
a = (n - 4) / 6;
result += 3*a*a + 7*a + 4;
} else if (n % 6 == 5) {
a = (n - 5) / 6;
result += 3*a*a + 8*a + 5;
} else {
a = n / 6;
result += 3*a*a + 3*a + 1;
}
return result;
}