package org.matheclipse.core.generic.combinatoric;

import java.util.Iterator;

/**
 * Iterable for all k-combinations from a set
 * 
 * See Combination
 */
public class KSubsetsIterable implements Iterator, Iterable {

	final private int n;
	final private int k;
	final private int x[];
	private long bin;
	private boolean first;

	public KSubsetsIterable(final int len, final int parts) {
		super();
		n = len;
		k = parts;
		//f = fun;
		x = new int[n];
		for (int a = 0; a < n; a++) {
			x[a] = a;
		}
		bin = binomial(n, k);
		first = true;
	}

	public int[] next() {
		if (bin-- == 0) {
			return null;
		}
		if (first) {
			first = false;
			return x;
		}
		int i = k - 1;
		while (x[i] == n - k + i) {
			i--;
		}
		x[i] = x[i] + 1;
		for (int j = i + 1; j < n; j++) {
			x[j] = x[j - 1] + 1;
		}
		return x;
	}

	public static long binomial(final long n, final long k) {
		long bin = 1;
		long kSub = k;
		if (kSub > (n / 2)) {
			kSub = n - kSub;
		}
		for (long i = 1; i <= kSub; i++) {
			bin = (bin * (n - i + 1)) / i;
		}
		return bin;
	}

	public boolean hasNext() {
		return true;
	}

	public void remove() {
		throw new UnsupportedOperationException();
	}

	public Iterator iterator() {
		return this;
	}
}

 

Ads help maintain this website.