package com.jwetherell.algorithms.sequence;

/**
 * Compute the result of adding a sequence of numbers from N (startNumber) to N+X (startNumber+numberOfNumbersToCompute)
 * <p>
 * https://en.wikipedia.org/wiki/Arithmetic_progression
 * <br>
 * @author Justin Wetherell <phishman3579@gmail.com>
 */
public class ArithmeticProgression {

    /**
     * Compute the result of adding X (numberOfNumbersToCompute) together starting at N (startNumber).
     * <p>
     * e.g. result = N + (N+1) + (N+2) + (N+3) + ..... + (N+X)
     */
    public static final long sequenceTotalUsingLoop(int startNumber, int numberOfNumbersToCompute) {
        int start = startNumber;
        int length = numberOfNumbersToCompute;
        long result = 0L;
        while (length > 0) {
            result += start++;
            length--;
        }
        return result;
    }

    /**
     * Compute the result of adding X (numberOfNumbersToCompute) together starting at N (startNumber) using triangular numbers.
     * <p>
     * e.g. result = N + (N+1) + (N+2) + (N+3) + ..... + (N+X)<br>
     * <br>
     * https://en.wikipedia.org/wiki/Triangular_number
     */
    public static final long sequenceTotalUsingTriangularNumbers(int startNumber, int numberOfNumbersToCompute) {
        // n*(n+1)/2
        final int start = startNumber;
        final int length = numberOfNumbersToCompute;

        long result = length * (length + 1) / 2;
        result += (start - 1) * length;
        return result;
    }
}
