//@Description Partition the range [0, N-1] int P similar partitions.
include "generators.skh";
pragma options "--bnd-inline-amnt 3 --bnd-inbits 3 ";
void partition(int p, int P, int N, ref int ibeg, ref int iend){
if(p< expr(5, {p, P, N, N/P, N%P}, 2, {TIMES, PLUS}) ){
iend = expr(5, {p, P, N, N/P, N%P}, 2, {TIMES, PLUS});
ibeg = expr(5, {p, P, N, N/P, N%P}, 2, {TIMES, PLUS});
}else{
iend = expr(5, {p, P, N, N/P, N%P}, 2, {TIMES, PLUS});
ibeg = expr(5, {p, P, N, N/P, N%P}, 2, {TIMES, PLUS});
}
}
harness void testPartition(int p, int N, int P){
if(N<1 || P < 1){ return; }
if(p<P){
int ibeg, iend;
partition(p, P, N, ibeg, iend);
assert iend - ibeg < (N/P) + 2;
if(p+1 < P){
int ibeg2, iend2;
partition(p+1, P, N, ibeg2, iend2);
assert iend == ibeg2;
}
if(p==0){ assert ibeg == 0; }
if(p==P-1){ assert iend == N; }
}
}