//@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; } } }