cp's OEIS Frontend

This is a front-end for the Online Encyclopedia of Integer Sequences, made by Christian Perfect. The idea is to provide OEIS entries in non-ancient HTML, and then to think about how they're presented visually. The source code is on GitHub.

A289236 Square array a(p,q) read by antidiagonals: a(p,q) = the number of line segments that constitute the trajectory of a billiard ball on a pool table with dimensions p X q, before the ball reaches a corner.

Original entry on oeis.org

1, 2, 2, 3, 1, 3, 4, 4, 4, 4, 5, 2, 1, 2, 5, 6, 6, 6, 6, 6, 6, 7, 3, 7, 1, 7, 3, 7, 8, 8, 2, 8, 8, 2, 8, 8, 9, 4, 9, 4, 1, 4, 9, 4, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 5, 3, 2, 11, 1, 11, 2, 3, 5, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12
Offset: 1

Views

Author

Luc Rousseau, Jun 28 2017

Keywords

Comments

The billiard game considered here is an idealized one: the pool table is a rectangle with vertices (0,0), (p,0), (p,q), (0, q); the ball is shrunk to a point and is launched from vertex (0,0) with initial velocity vector (1,1); collisions are supposed elastic and friction is supposed nonexistent, so that the ball can never stop on the table; when the ball bounces, the angle of reflection is equal to the angle of incidence; the ball can only exit through a vertex.
a(p,q) counts the line segments that constitute the trajectory.

Examples

			In a square-shaped pool table, the ball just crosses diagonally. a(p,p)=1.
In a pool table of dimensions 2 X 1, the ball bounces once and exits. a(2,1)=2.
The square array a(p,q) begins:
   1  2  3  4  5  6  7
   2  1  4  2  6  3  8
   3  4  1  6  7  2  9
   4  2  6  1  8  4 10
   5  6  7  8  1 10 11
   6  3  2  4 10  1 12
   7  8  9 10 11 12  1
		

Crossrefs

Cf. A059026 (the triangle version).

Programs

  • Java
    long a(long p, long q) {
    long i = 0, x = 0, y = 0, dx = +1, dy = +1, s = 1;
    while ((((x % p) != 0) || ((y % q) != 0)) || (i == 0)) {
    i ++; long xx = x + dx; long yy = y + dy;
    boolean xok = (0 <= xx) && (xx <= p);
    boolean yok = (0 <= yy) && (yy <= q);
    if (xok && yok) { x = xx; y = yy; }
    else { s ++;
    if (! xok) { dx = -dx; }
    if (! yok) { dy = -dy; }
    }} return s; }

Formula

a(p,q) = (p + q) / gcd(p, q) - 1.