private interface ITerm {
private class Term : ITerm {
public Term(int item1, int item2, int item3) {
public int Item1 { get; private set; }
public int Item2 { get; private set; }
public int Item3 { get; private set; }
private interface ITermPrinter {
private class TermPrinter : ITermPrinter {
public void Print(ITerm term) {
Console.Out.Write(term.Item1);
private void Print(string s, int i) {
Console.Out.Write("^" + i);
private interface ITermsPrinter {
void Print(ITerm[] terms);
private class TermsPrinter : ITermsPrinter {
private ITermPrinter termPrinter;
public TermsPrinter(ITermPrinter termPrinter) {
if (termPrinter == null) {
throw new ArgumentNullException("termPrinter");
this.termPrinter = termPrinter;
public void Print(ITerm[] terms) {
termPrinter.Print(terms[0]);
for (int i = 1; i < terms.Length; i++) {
Console.Out.Write(" + ");
termPrinter.Print(terms[i]);
private interface ITermFactory {
ITerm Create(int item1, int item2, int item3);
private class TermFactory : ITermFactory {
public ITerm Create(int item1, int item2, int item3) {
return new Term(item1, item2, item3);
public static void Main() {
new Program(new TermsPrinter(new TermPrinter()), new TermFactory()).Start();
private ITermsPrinter termsPrinter;
private ITermFactory termFactory;
private Program(ITermsPrinter termsPrinter, ITermFactory termFactory) {
if (termsPrinter == null) {
throw new ArgumentNullException("termsPrinter");
if (termFactory == null) {
throw new ArgumentNullException("termFactory");
this.termsPrinter = termsPrinter;
this.termFactory = termFactory;
for (int i = 2; i <= 16; i += 2) {
this.termsPrinter.Print(this.TermShizzle(i));
private ITerm[] TermShizzle(int power) {
ITerm[] terms = new ITerm[power + 1];
terms[0] = this.termFactory.Create(1, power, 0);
for (int l = power / 2; j <= l; j++) {
i = (int) ((double) (power-j+1) / j * i);
terms[j] = this.termFactory.Create(i, power - j, j);
for (; j <= power; j++) {
terms[j] = this.termFactory.Create(terms[power - j].Item1, power - j, j);