# Iterating over permutations, part 3 – Steinhaus-Johnson-Trotter algorithm

Yet a third, also completely different, algorithm was discovered by American mathematician Hale Trotter in 1962, and, independently, American mathematician Selmer Johnson in 1963. This is called the Steinhaus–Johnson–Trotter algorithm. I have a PowerShell implementation of this too.

The key concept is to assign each element in the permutation a direction – either left or right. Use < to indicate that the element is looking left, and > to indicate that the element is looking right.

Example: <A <B <C <D

Then the algorithm is follows:

1. Start with the permutation in ascending order. All elements start looking left.
2. Define a mobile element as one which is larger than the element it is looking at.
3. Find the largest mobile element x. (If no elements are mobile, then you are done iterating.)
4. Swap x with the element it is looking it. This is the next permutation.
5. Reverse the direction for all elements greater than x.
6. Repeat steps 2 through 5 until step 3 fails.

Working through the example:

• <A <B <C <D – move D to the left
• <A <B <D <C – move D to the left
• <A <D <B <C – move D to the left
• <D <A <B <C – move C to the left and reverse direction of D
• D> <A <C <B – move D to the right
• <A D> <C <B – move D to the right
• <A <C D> <B – move D to the right
• <A <C <B D> – move C to the left and reverse direction of D
• <C <A <B <D – move D to the left
• <C <A <D <B – move D to the left
• <C <D <A <B – move D to the left
• <D <C <A <B – move B to the left and reverse direction of C and D
• D> C> <B <A – move D to the right
• C> D> <B <A – move D to the right
• C> <B D> <A – move D to the right
• C> <B <A D> – move C to the right and reverse direction of D
• <B C> <A <D – move D to the left
• <B C> <D <A – move D to the left
• <B <D C> <A – move D to the left
• <D <B C> <A – move C to the right and reverse direction of C
• D> <B <A C> – move D to the right
• <B D> <A C> – move D to the right
• <B <A D> C> – move D to the right
• <B <A C> D> – no mobile elements, we’re done

Note that the largest element (in this case, D) goes back and forth, bouncing off of the ends of the permutation.

So (n – 1)/n of the time, the next permutation can be found very quickly (in constant time) by just keeping track of the largest element.

The other 1/n of the time, the largest element is stuck, and a scan is necessary to find the largest mobile element (or lack thereof,) and then to reverse the direction of larger elements. This takes time proportional to n and unsticks the largest element again.

So on average it takes constant time to find the next permutation: O(1) + (O(n)/n) = O(1).

# Iterating over permutations, part 2 – Heap’s algorithm

Last time we talked about how Nariyana Pandita iterated over permutations in India in the 1300s. Also see Iterating over permutations, part 3 – Steinhaus-Johnson-Trotter algorithm.

600 years later, in 1963, B. R. Heap showed a completely different way to do it. Heap’s algorithm (original paper, PDF) takes a divide-and-conquer approach. I have a PowerShell implementation of this too.

Example: A B C D E F G

1. First set up an outer loop. This loop controls the last place in the permutation and cycles all of the elements through it in turn:
• ? ? ? ? ? ? G
• ? ? ? ? ? ? D
• ? ? ? ? ? ? C
• ? ? ? ? ? ? B
• ? ? ? ? ? ? E
• ? ? ? ? ? ? F
• ? ? ? ? ? ? A
2. Then set up a second loop inside the first one. This loop controls the next-to-last place in the permutation. Note that this loop iterates one fewer time than the outer loop.
• ? ? ? ? ? F G
• ? ? ? ? ? E G
• ? ? ? ? ? B G
• ? ? ? ? ? C G
• ? ? ? ? ? D G
• ? ? ? ? ? A G
3. Then set up a third loop inside the second one
4. And fourth loop inside that

… and so on until every place in the permutation has a loop. Have the innermost loop print the permutation or do what ever operation on it is desired.

All the loops work in the same way. Consider the loop that controls the kth place in the permutation. Call the preceding (k – 1) places the prefix.

Some examples:

• k = 6: A B C D E F G
• k = 5: A B C D E F G

If the length of the prefix (k – 1) is odd, then the loop swaps elements as follows:

1. At the end of the first iteration, swap the first element in the prefix into the controlled place
2. At the end of the second iteration, swap the second element in the prefix into the controlled place
3. At the end of the (k – 1)th iteration, swap the (k – 1)th element in the prefix into the controlled place

Note that every element in the prefix takes its turn in the controlled place.

If the length of the prefix (k – 1) is even, then the shuffling of the prefix by the inner loops is more fortuitous, and the loop’s swapping logic is simpler:

• At the end of every iteration, swap the first element in the prefix into the controlled place

This is easier to see in action. Here are three loops k = 2, k = 3, and k = 4 working together:

• k = 4, first iteration begins
A B C D E F G
• k = 3, first iteration begins
A B C D E F G
• k = 2, first iteration begins
A B C D E F G
• k = 2, swap the first and second elements, second iteration begins
B A C D E F G
• k = 3, swap the first and third elements, second iteration begins
C A B D E F G
• k = 2, first iteration begins
C A B D E F G
• k = 2, swap the first and second elements, second iteration begins
A C B D E F G
• k = 3, swap the first and third elements (again), third iteration begins
B C A D E F G
• k = 2, first iteration begins
B C A D E F G
• k = 2, swap the first and second elements, second iteration begins
C B A D E F G
• k = 4 – swap the first and fourth elements, second iteration begins
D B A C E F G
• k = 3, first iteration begins
D B A C E F G
• k = 2, first iteration begins
D B A C E F G
• k = 2, swap the first and second elements, second iteration begins
B D A C E F G
• k = 3, swap the first and third elements, second iteration begins
A D B C E F G
• k = 2, first iteration begins
A D B C E F G
• k = 2, swap the first and second elements, second iteration begins
D A B C E F G
• k = 3, swap the first and third elements (again), third iteration begins
B A D C E F G
• k = 2, first iteration begins
B A D C E F G
• k = 2, swap the first and second elements, second iteration begins
A B D C E F G
• k = 4 – swap the second and fourth elements, third iteration begins
A C D B E F G
• k = 3, first iteration begins
A C D B E F G
• k = 2, first iteration begins
A C D B E F G
• k = 2, swap the first and second elements, second iteration begins
C A D B E F G
• k = 3, swap the first and third elements, second iteration begins
D A C B E F G
• k = 2, first iteration begins
D A C B E F G
• k = 2, swap the first and second elements, second iteration begins
A D C B E F G
• k = 3, swap the first and third elements (again), third iteration begins
C D A B E F G
• k = 2, first iteration begins
C D A B E F G
• k = 2, swap the first and second elements, second iteration begins
D C A B E F G
• k = 4 – swap the third and fourth element, fourth iteration begins
D C B A E F G
• k = 3, first iteration begins
D C B A E F G
• k = 2, first iteration begins
D C B A E F G
• k = 2, swap the first and second elements, second iteration begins
C D B A E F G
• k = 3, swap the first and third elements, second iteration begins
B D C A E F G
• k = 2, first iteration begins
B D C A E F G
• k = 2, swap the first and second elements, second iteration begins
D B C A E F G
• k = 3, swap the first and third elements (again), third iteration begins
C B D A E F G
• k = 2, first iteration begins
C B D A E F G
• k = 2, swap the first and second elements, second iteration begins
B C D A E F G

Note that the k = 4 loop, which has an odd-length prefix, swaps first and fourth, second and fourth, third and fourth; but the k = 3 loop, which has an even-length prefix, swaps first and third, first and third. The k = 3 loop has less work to do, because the k = 2 loop moved a new element to the first place for it.

# Iterating over permutations, part 1 – Nariyana Pandita method

It is often interesting to iterate over all permutations of an array. Consider the three letters N, O, W. There are six permutations, and three of them are English words:

• NOW
• NWO
• ONW
• OWN
• WNO
• WON

I found three different algorithms to iterate over permutations and implemented them all in PowerShell. Also see Iterating over permutations, part 2 – Heap’s algorithm and Iterating over permutations, part 3 – Steinhaus-Johnson-Trotter algorithm.

In India in the 1300s, mathematician Nariyana Pandita described a method to find the next permutation in alphabetical order, starting from a given permutation:

1. Find the rightmost pair of elements that are in ascending order. (If the entire permutation is in descending order, there is no next permutation, and we’re done.) Call this the pivot. Notice that all of the elements from the second element in the pivot to the end of the permutation are in descending order. Call this the tail.
Example: C B D G F E A
2. Find the rightmost element in the tail that is larger than the first element of the pivot.
Example: C B D G F E A
3. Swap this element with the first element of the pivot. Note that the new tail is still in descending order.
Example: C B E G F D A
4. Put the tail in ascending order by reversing it.
Example: C B E A D F G

The time this algorithm takes is proportional to the length of the tail. The tail could be as short as a single element, e. g. A B C D E F G => A B C D E G F. Or it could be as long as the whole permutation, minus one, e.g. A G F E D C B => B A C D E F G.

It turns out though that short tails are very, very common, and long tails are very, very, rare. In half of all permutations, the tail length is 1; in half of the remainder, the tail length is 2; in half of the remainder, the tail length is 3, etc. The exponential decay in the count of permutations outweighs the linear growth in the tail length so completely that, on average, you can find the next permutation in constant time (which is less time than it takes to print the result.)

# Grabbing a dump file of another process via MiniDumpWriteDump

I was debugging a particular audio problem and I needed a process dump with full memory.

I used an internal gather-dumps tool and asked it to give me a bunch of dumps of the problem with full memory… and it gave me some dumps without full memory.

This told me that either the gather-dumps tool was broken, or MiniDumpWriteDump was broken, or perhaps both were working fine and my debugger was lying to me about the full-memory-ness of the dumps I was looking at.

To help narrow the problem down, I created a tool that is a very simple wrapper around MiniDumpWriteDump. This grabbed full memory dumps just fine, so I turned my attention toward the internal gather-dumps tool.

Usage:

```>minidumpwritedump.exe
minidumpwritedump.exe [--help | -? | /?]
minidumpwritedump.exe --processId <processId> --dumpType <dumpType> --fileName <fileName>

See https://docs.microsoft.com/en-us/windows/win32/api/minidumpapiset/nf-minidumpapiset-minidumpwritedump```

EDIT 2020-06-30: added a PowerShell script to translate a MINIDUMP_TYPE number into a human-readable set of values

Usage:

```.\minidump_type.ps1 -minidump_type 482707
MiniDumpWithDataSegs, MiniDumpWithFullMemory, MiniDumpScanMemory, MiniDumpFilterModulePaths, MiniDumpWithProcessThreadData, MiniDumpWithoutOptionalData, MiniDumpWithFullMemoryInfo, MiniDumpWithThreadInfo, MiniDumpWithoutAuxiliaryState, MiniDumpWithPrivateWriteCopyMemory, MiniDumpIgnoreInaccessibleMemory, MiniDumpWithTokenInformation```

# Collecting audio logs the REALLY old-fashioned way – on Windows 7

I’ve blogged before about how to collect audio logs using Windows Performance Recorder profiles (WPRP files), among other things:

I’ve blogged before about what to do if you have an audio problem on Windows 7:

I’ve blogged before about the Trusted Audio Drivers audio digital rights management feature:

Recently I was involved in a Windows 7 audio support issue that involved SHA-1 deprecation and Trusted Audio Drivers. It was very handy to be able to collect audio logs and Code Integrity logs on Windows 7, but it turns out the Windows 7 version of Windows Performance Recorder has slightly different syntax requirements for WPRP files.

Here are the WPRP files we used:

# Safe primes and unsafe primes

Secure communications like HTTPS, SSH, SFTP and others rely on cryptographic handshakes like the Diffie-Hellman key exchange to negotiate a shared key.

There are lots of ways to set up a Diffie-Hellman key exchange. The Logjam security vulnerability starts with a flaw in the negotiation process to ensure a relatively weak one is used – finite-field with a small prime – and ends up with a man-in-the-middle attack.

The paper uses the term “safe prime” and thought I would dig a little into exactly what that meant.

Refresher: a given prime p defines the Galois field GF(p). This contains p elements: 0 through p – 1 inclusive. Addition and multiplication are both modulo p. We can start with any one of these elements – call it g, for “generator” – and form the sequence 1, g, g2, g3, and so on, until we eventually come back to 1. Call the “period” (length) of this sequence x. It is a law of mathematics that x always evenly divides p – 1.

The vulnerable Diffie-Hellman key exchange goes something like this, skipping over some details:

1. Alice has a secret key a; Bob has a secret key b.
2. Alice and Bob start a conversation where the attacker Eve can hear them – they publicly agree to a particular prime p and a generator g.
3. Alice calculates ga mod p and shares it; Bob calculates gb mod p and shares it.
4. Alice calculates (gb)a mod p and Bob calculates (ga)b mod p. These are necessarily equal, and their shared value is used as a secret symmetric key for the rest of the conversation.

For cryptographic reasons, we want g’s period in GF(p) to be reasonably large. If the period is small, that gives Eve a reasonable chance to guess the shared secret, which is even worse than her man-in-the-middle attack from Logjam.

So how do we ensure the period is small? One way to do it (not necessarily a good way to do it) is to arrange for p – 1 to have very few divisors.

Could p – 1 be prime? Well, yes, there are two consecutive primes – namely, (2, 3) – but choosing p = 3 has some other cryptographic drawbacks which outweigh the benefit 🙂

OK, well, then, if p – 1 can’t be prime, can it be a semiprime?

Yes, it can. In fact, it can be of the form 2q where q is also prime. In this case, the prime pair (q, p = 2q + 1) are called a (Sophie Germain prime, safe prime) pair. This is the technical definition of “safe prime.”

To illustrate this, let’s choose a couple of primes and see what their generator cycles look like. In particular, let’s look at the safe prime 59 (59 – 1 = 2 * 29 so the corresponding Sophie Germain prime is 29) and the “unsafe prime” 61 (61 – 1 = 60 is a smooth number with quite a lot of factors.)

For each prime I made a table where the rows are all the possible generators g and the columns are the exponents i in gi. I highlighted the columns x where x is a factor of p – 1

Here’s the safe prime 59:

And here’s the unsafe prime 61:

Notice that there are only four periods for 59, in particular x = 1, 2, 29, and 58. These are the four factors of (59 – 1). When choosing a generator, periods 1 and 2 are of course to be avoided; this is easy to do. Period 58 is as good as possible. Period 29 might be accepted as good enough; but if you wanted to go the extra mile, you could detect and correct as follows.

• Calculate g(p – 1)/2. This will always be -1 or 1.
• If it’s -1, g has period p – 1, which is as good as it gets.
• If it’s 1, g has period (p – 1)/2. Use –g instead, which has period p – 1, unless (q, p) = (2, 5), which we reject for the same reasons as (2, 3).

By contrast, there are no fewer than 12 periods for 61, in particular x = 1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30, 60. These are the factors of (61 – 1). It is not so easy to decide where the threshold of acceptability lies (30? 12?), and it is not so easy to correct generators with small periods, or even to detect them (other than 0, 1, and p – 1, which are still trivial to avoid.)

Real cryptographic primes are of course much, much bigger than 61, but this serves as an illustration of why safe primes are called “safe”.

# Gravity and centripetal acceleration on a space station

Okay, so I’m standing on a space station that is a rotating toroid so I experience One gravity under my feet. I’m holding a coffee cup and let it drop. Isn’t its drop going to follow a V*cos function? Unless the space station is really small it’s going to look like it accelerates at one G, but what is the force it experiences on impact?

It seems that that force won’t be the same as if it were truly accelerating. Now add a little push, in the direction of spin, and anti-spin. Won’t the behavior vary?

I’m writing a science fiction book and would like to get it right.

Robert blanton

To answer this question, it is important to emphasize the difference between gravity per se and centripetal acceleration.

 Gravity Centripetal acceleration Exists between any two objects with massStronger between objects of large massStronger as objects are closer together Keeps one object in orbit around another objectStronger as the radius of orbit increasesStronger as the time of orbit decreases

For some gory detail on how gravity and centripetal acceleration interplay on the Earth, see Gravity and centripetal acceleration on Earth. TL:DR; gravity is king, centripetal acceleration can mostly be ignored.

On the space station, the situation is exactly reversed. Centripetal acceleration is king, and gravity can mostly be ignored.

Let’s define a “day” as the amount of time it takes for our space station to undergo a single complete rotation. We’ll also define t as the length of the “day”, in seconds.

Let r be the radius of the space station, in meters.

We can manipulate the formula a = v2/r to relate the length of the day and the radius of the space station. Start with a = v2/r and substitute both a = 9.8 m/s2 (which is what humans on Earth are used to) and v = 2πr/t. Then do some manipulation to get:

9.8t2 = 4π2r

The radius is proportional to the square of the orbital time. That is, smaller space stations need to spin faster. The bigger the space station, the longer the day.

For story purposes, if we want a particular size, we can calculate the required length of the day. Solving for t:

t = √(4π2r/9.8) = 2.0√r

For example, a space station of radius 150 meters would need to have a day of 24 seconds; a space station of radius 1,500 meters would need to have a day of 77 seconds.

Or if we want a particular day length, we can calculate the required size. Solving for r:

r = 9.8t2/(4π2) = 0.25t2

So if we want a day to last 60 seconds, we need a space station of radius 900 m; if we want a day to last 120 seconds, we need a space station of radius 3.6 km.

The acceleration varies as you wander throughout the space station. The closer you are to the rotational axis, the weaker the effect. So things near the ceiling will be accelerated slightly less than things on the floor.

The variation will be minimal if the hole in the toroid is large; that is to say, if the ceiling and the floor are both quite far from the rotational axis.

So if the space station is large, the coffee cup will behave almost exactly as it does on the Earth. If you add a little push, the coffee cup will follow a parabolic path to the floor. If the floor is hard, the cup will break.

If the space station is small, and you had a fairly precise scale, you would notice that the cup weighs less on the top shelf than it does on the floor.

Just for fun, suppose that in addition to the inhabited toroidal part of the space station, there was a service area in the center, on the rotational axis. People would be weightless here.

Perhaps the service area is connected to the toroidal part by spokes, so that it can be reached without going outside. You would experience a gradual transition between full Earth gravity and complete weightlessness as you went along the spoke. Perhaps you have a ladder on the spoke which has rungs quite close together near the edge, where there is full gravity; and as you ascend toward the hub, the rungs get farther apart, as you move from climbing, to jumping, to swimming, to floating.

# Gravity and centripetal acceleration on Earth

Earth accelerates you in two different directions at once. Earth’s gravity pulls you one way, and its rotation pushes you another. We consider the direction, magnitude, and variation of these forces at various points on the Earth’s surface.

## Gravity

Direction: gravity pulls you toward the center of the Earth.

Magnitude: if you are on or above the Earth’s surface, the pull’s strength follows the “Acceleration due to Earth’s gravity” formula from “Formulas and facts” below.

Variation: the pull’s strength is inversely proportional to the square of your distance from the center of the Earth, so long as you’re on or above the surface. The closer you get to the center, the stronger gravity is; the further away you get from the center, the weaker gravity is.

• The Earth is shaped like a sphere. Well… not quite like a sphere. It’s flattened a bit, like an M&M. The “M”s are printed at the North and South Poles, and the Equator goes around the edge.
This means that when you’re at the Poles, you’re closer to the center of the Earth than you are at the Equator. So gravity is stronger at the Poles, and weaker at the Equator.
• Also, but to a much lesser degree, the Earth’s surface is uneven. There are bumps (mountains) and crannies (valleys.)
At a given latitude, when you’re at the bottom of a valley, you’re closer to the center of the Earth than you are at the top of a mountain. So gravity is weaker on mountains. (It is tempting to say that gravity is stronger in valleys, but valleys are a little complicated, because the higher land around you pulls you in the opposite direction than the rest of the Earth. It is true to say that gravity is stronger on low-laying plains, though.)
• The strongest gravity is at the North Pole, which is pretty much at sea level. (The South Pole is on a plateau.)
• The weakest gravity is at the peak of Mt. Chimborazo in Ecuador.
• What about Mt. Everest, you say? Well, Mt. Everest is the highest mountain above sea level, but the sea follows the M&M shape, so Mt. Chimborazo is further from the center of the Earth.

## Centripetal acceleration

Direction: centripetal acceleration pushes you away from Earth’s axis of rotation.

If you’re at the Equator, this is straight up; if you are at the North Pole or South Pole, the only effect is to make you very slightly dizzy; and if you are somewhere in between, you can get a basic feel for the direction by looking at the nearest satellite dish.

You can get a more precise direction by knowing your latitude and compass heading:

1. Point an arrow straight up (that is, away from the center of the Earth.)
2. If your latitude is zero, you’re on the Equator. You’re done.
3. Bend it down, in the direction of the Equator, by an angle equal to your latitude.
• If you are in the Northern hemisphere, bend it South.
• If you are in the Southern hemisphere, bend it North.
4. The final direction of the arrow is the way centripetal acceleration is pushing you.

Magnitude: the pull’s strength follows the “Acceleration due to Earth’s rotation” formula.

Variation: the pull’s strength is proportional to the square of your distance from Earth’s axis of rotation. The closer you get to the axis, the weaker centripetal acceleration is. The further you get from the axis, the stronger centripetal acceleration is.

In particular, centripetal acceleration is strongest at the Equator. It is weakest at the Poles. (In fact, it is zero at the Poles.)

## Putting the two together

Direction: gravity is much stronger than centripetal acceleration, so the sum of the two vectors always points almost completely in the direction of the gravity vector.

Magnitude: the pull’s strength follows the “Combined acceleration due to Earth’s gravity and rotation” formula. The angle between the two vectors is always between 90° and 180°, so the forces counteract each other; the total acceleration is always a little bit less than gravity alone (or, in the case of the Poles, exactly equal to gravity alone.)

Variation: because of the M&M shape, centripetal acceleration (which counteracts gravity) is strongest in the same places where gravity is already weak – the Equator, and mountains. So centripetal acceleration just exaggerates the weakness of already-weak gravity.

Here’s a table. I throw in La Rinconada, in Peru, because it’s the highest permanently inhabited place, and it’s also quite near the equator. The table has the strongest combined acceleration at the top and the lowest at the bottom.

 Place To center (m) ag (m/s2) Lat. (°) To axis (m) ar (m/s2) a (m/s2) North Pole 6.357e6 9.863 90.00 0 0 9.863 Mean 6.371e6 9.820 30.00 5.517e6 0.009339 9.811 Equator 6.378e6 9.798 0.00 6.378e6 0.01080 9.787 Mt. Everest 6.382e6 9.786 27.99 5.636e6 0.009539 9.777 La Rinconada 6.383e6 9.783 14.63 6.176e6 0.01045 9.773 Mt. Chimborazo 6.384e6 9.780 1.47 6.382e6 0.01080 9.769

In conclustion, a varies across the Earth from 9.769 m/s2 to 9.863 m/s2, which is a variation of about 0.95%. About 0.84% of this comes from variation in gravity, and the other 0.11% comes from variation in centripetal acceleration.

## Facts and formulas

• Newton’s second law of motion
F is the force applied to an object
m is the mass of the object
a is the acceleration experienced by the object
F = ma
• Gravitational constant
G = 6.674e-11 m3/(kg s2)
• Earth mass
M = 5.9722e24 kg
• Earth radius (at sea level)
• At the North Pole or South Pole = 6.357e6 m
• Mean = 6.371e6 m
• At the Equator = 6.378e6 m
• Acceleration due to Earth’s gravity
G is the gravitational constant
M is Earth’s mass
r is the distance of the object from the center of the Earth
ag = GM/r2
• Centripetal acceleration
v is the speed of an object orbiting a fixed point
r is the radius of the orbit
t is the time to complete a single orbit; note that v = 2πr/t
a is the acceleration experienced by the object
a = v2 /r = 4π2r/t2
• Earth rotation
• Nominal time for one solar rotation: 24 * 60 * 60 = 8.6400e4 s
• Actual time for one solar rotation: a teensy bit more due to leap seconds
• Actual time for one sidereal rotation: T = 8.6164e4 s
• Acceleration due to Earth’s rotation
r is the distance between the object and the Earth’s axis of rotation (not the center of the Earth)
T is the time for one sidereal rotation
ar is the acceleration experienced by the object
ar = 4π2r/T2
a is a vector
b is another vector
θ is the angle between a and b when placed tail-to-tail
|a + b|2 = |a|2 + |b|2 + 2|a||b|cos θ
• Combined acceleration due to Earth’s gravity and rotation
ag is the acceleration due to Earth’s gravity
ar is the acceleration due to Earth’s rotation
L is the latitude of the object, in degrees; the angle of the two vectors in radians is π – (πL/180)
a is the combined acceleration
|a|2 = |ag|2 + |ar|2 + 2|ag||ar|cos (π – (πL/180))

# Final Fantasy X blitzball tech map

I’m leveling up my kick-ass women’s blitzball team and I’m running into trouble with Irga Ronso. She has three key techniques:

• Pile Wither
• Wither Tackle 3
• Super Goalie

Usually my approach is to learn techniques using Techcopy.

But Irga’s Wither Tackle 3 and Super Goalie are both locked until she learns at least one key technique (or maybe two.)

Which means I’m looking at Pile Wither…

… but Pile Wither cannot be Techcopy’d.

So in order for Irga to achieve her full potential, I need to either:

• Win Pile Wither in a tournament and award it to her
• Win Tech Find in a tournament and use it to unlock either Wither Tackle 3 or Super Goalie for her, so she can Techcopy it later
• Release her as a free agent and hope some other team helps her learn a key technique

I am unwilling to release her because I like having her on my team. So I’m looking at the “win Pile Wither” or “win Tech Find” approaches. Luckily, these can be tried in parallel.

The “win Pile Wither” approach is straightforward.

But for the “win Tech Find” approach to work, I need to know where Wither Tackle 3 and Super Goalie are on the list of techniques.

That is, I need a map of the techniques.

I built up my recruiting skill to maximum level and chatted up all the players on my team (and a couple of people not on my team who happened to be nearby) and got a pretty good map, which follows. The techniques marked with question marks are just guesses based on the pattern and fuzzy memories of previous games I’ve played:

 1 Jecht Shot Wither Shot Wither Pass 2 2 Jecht Shot 2? Wither Shot 2 Wither Pass 3 3 Sphere Shot Wither Shot 3 Volley Shot 4 Invisible Shot? Venom Pass Volley Shot 2? 5 Venom Shot Venom Pass 2 Volley Shot 3? 6 Venom Shot 2 Venom Pass 3 Venom Tackle 7 Venom Shot 3 Nap Pass Venom Tackle 2 8 Nap Shot Nap Pass 2 Venom Tackle 3? 9 Nap Shot 2? Nap Pass 3? Nap Tackle 10 Nap Shot 3 Wither Pass Nap Tackle 2
 1 Nap Tackle 3 Anti-Venom 2 Brawler 2 Wither Tackle Anti-Nap Pile Venom? 3 Wither Tackle 2 Anti-Nap 2? Pile Wither 4 Wither Tackle 3 Anti-Wither Regen 5 Drain Tackle Anti-Wither 2 Good Morning! 6 Drain Tackle 2 Anti-Drain Hi-Risk 7 Drain Tackle 3 Anti-Drain 2? Golden Arm 8 Tackle Slip Spin Ball Gamble 9 Tackle Slip 2 Grip Gloves Super Goalie 10 Anti-Venom Elite Defense Aurochs Spirit?

I will update the map as I confirm my guesses.