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
3-Ball-Cascade interrupted by a 441
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)