Mathematics in Juggling

Examples for possible patterns

3 (3-Ball-Cascade)

straight-straight-vamp

3-Ball-Shower

Why Mathematics in Juggling?

  • Invented around 1985, when sending videos was not that easy
  • "Siteswap" notation for complex patterns
  • Can be used to search systematically for new patterns
  • Possible to break down complex patterns into simpler ones
  • Apart from that: Just for fun

What Siteswap notation describes

Does not describe:

  • Different types of throws and catches
  • Type of object thrown

Describes:

  • Contiuous patterns
  • Order of throwing the balls is variable

Basics of siteswap notation

3-Ball-Cascade

WebSlides Files

3-Ball-Cascade interrupted by a 441

WebSlides Files

Conditions:

  • Throws follow a beat: Throws seperated by constant time interval
  • Alternating hands
  • Only one ball is thrown and caught on one beat

n-throws

(n-1) throws happen until the same ball is thrown again

  • 0-Throw: No ball
  • 1-Throw: Hand-off
  • 2-Throw: Holding the ball (or low vertical throw)
  • 3-Throw: Regular diagonal throw
  • 4-Throw: Vertical throw
  • 5-Throw: High diagonal throw
  • ...

Examples for possible patterns

3 (3-Ball-Cascade)

300

51

What is different for patterns with an odd/even sum?

441

4413

How can we determine the number of balls?

71 (4-Ball-Shower)

330

Breaking down patterns into orbits

4413

4013

0400

Determining how hard a pattern might be

  • Highest throw
  • Even sum: Might be possible to perform hard parts with the strong hand
  • High and low throws alternating

Finding new Patterns

def is_valid(a):
  a_ext = a[-1:-1] + a + a
  jugglable = []
  for i, a_i in zip(range(len(a)), a_ext[len(a)+1:]):
      jugglable_ithrow = 0
      for j in range(i+len(a)+1):
          if j+a_ext[j]==i+len(a)+1:
              jugglable_ithrow += 1
      jugglable.append(jugglable_ithrow)
  return all(np.array(jugglable)==1)

# brute force trying out patters:
highest_throw = 4
max_balls = 3
for a_0 in range(highest_throw+1):
  for a_1 in range(highest_throw+1):
      for a_2 in range(highest_throw+1):
          pattern = [a_0, a_1, a_2]
          if is_valid(pattern) and \
              not ((0 in pattern) or (2 in pattern)) and \
              np.mean(pattern)<=3:
              print(f'{pattern} ({int(np.mean(pattern))} balls)')
            

Output:

[1, 1, 1] (1 balls)
[1, 1, 4] (2 balls)
[1, 4, 1] (2 balls)
[1, 4, 4] (3 balls)
[3, 3, 3] (3 balls)
[4, 1, 1] (2 balls)
[4, 1, 4] (3 balls)
[4, 4, 1] (3 balls)
              

Finding new Patterns

Thanks.

  • Animations: https://jugglinglab.org
  • Lecture on Juggling: https://www.youtube.com/watch?v=38rf9FLhl-8