Problem 45 "Triangular, pentagonal, and hexagonal"

Triangle, pentagonal, and hexagonal numbers are generated by the following formulae:

Triangle Tn=n(n+1)/2 1, 3, 6, 10, 15, ...
Pentagonal Pn=n(3n−1)/2 1, 5, 12, 22, 35, ...
Hexagonal Hn=n(2n−1) 1, 6, 15, 28, 45, ...

It can be verified that T285 = P165 = H143 = 40755.

Find the next triangle number that is also pentagonal and hexagonal.

問 45 「三角数, 五角数, 六角数」

三角数, 五角数, 六角数は以下のように生成される.

T285 = P165 = H143 = 40755 であることが分かる.

次の三角数かつ五角数かつ六角数な数を求めよ.

struct Pentagon {
    n: u64,
    v: u64,
}

impl Pentagon {
    fn increment(&mut self) {
        self.v += self.n * 3 + 1;
        self.n += 1;
    }
    fn value(&self) -> u64 {
        self.v
    }
}

struct Hexagon {
    n: u64,
    v: u64,
}

impl Hexagon {
    fn increment(&mut self) {
        self.v += 4 * self.n + 1;
        self.n += 1;
    }
    fn value(&self) -> u64 {
        self.v
    }
}

fn main() {
    let mut p = Pentagon { n: 165, v: 40755 };
    let mut h = Hexagon { n: 143, v: 40755 };
    p.increment();
    let v = loop {
        while p.value() < h.value() {
            p.increment();
        }
        while h.value() < p.value() {
            h.increment();
        }
        if p.value() == h.value() {
            break p.value();
        }
    };

    println!("{}", v);
    assert_eq!(v, 1533776805);
}