Legofit
infers population history from nucleotide site patterns.
Loading...
Searching...
No Matches
intpart.c File Reference

Partitions of an integer into a given number of summands. More...

#include "intpart.h"
#include "misc.h"
#include "u64u64map.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>

Functions

static uint64_t numIntPart_r (int32_t n, int32_t k)
 Called by numIntPart.
uint64_t numIntPart (int32_t n, int32_t k)
 Number of ways to partition a positive integer n into k parts.
int traverseIntPartitions (int n, int k, int(*visit)(int kk, int a[kk], void *data), void *data)
 Partition a positive integer n into a sum of k positive integers.
void numIntPart_free (void)
 Free static variable.

Variables

static pthread_mutex_t map_lock = PTHREAD_MUTEX_INITIALIZER
static U64U64Map * map =NULL

Detailed Description

Partitions of an integer into a given number of summands.

Function Documentation

◆ numIntPart()

uint64_t numIntPart ( int32_t n,
int32_t k )

Number of ways to partition a positive integer n into k parts.

The public-facing function just locks the map and calls the static recursive function, numIntPart_r.

References numIntPart_r().

◆ numIntPart_r()

uint64_t numIntPart_r ( int32_t n,
int32_t k )
static

Called by numIntPart.

This assumes that the map is locked and does the real work of calculating the number of ways to partition a positive integer n into k parts.

References numIntPart_r().

Referenced by numIntPart(), and numIntPart_r().

◆ traverseIntPartitions()

int traverseIntPartitions ( int n,
int k,
int(* visit )(int kk, int a[kk], void *data),
void * data )

Partition a positive integer n into a sum of k positive integers.

Algorithm H, p 392 of Knuth, Donald E. 2011. The art of computer programming, volume 4A.