The supplementary material consists of code files and output files for the SageMath programs used in the article, as well as this guide.

Code files
----------

There are two versions of the article's program that searches for candidate partial prime factorisations for friends n of 10.
-- 'sageSolX.sage' contains the code for the version that *does not* use a special prime r.
-- 'sageSolXSpecial2.sage' contains the code for the version that *does* use a special prime r.

Additional '.sage' files call the above SageMath programs repeatedly and systematically to check some particular cases.
-- 'inputOmega8CheckPwrsOf5.sage' checks the cases where omega = 8. In each checked case, the power of 5 that exactly divides n is specified.
-- 'inputOmega9Base5Pwr02CheckPwrsOf31.sage' checks the cases where omega = 9, 5^2 exactly divides n, and 31^96 does not divide n. In each checked case, the power of 31 that exactly divides n is specified.
-- 'inputOmega9Base5Pwr06CheckPwrsOf19531.sage' checks the cases where omega = 9, 5^6 exactly divides n, and 19531^88 does not divide n. In each checked case, the power of 19531 that exactly divides n is specified.
-- 'inputOmega9CheckPwrsOf5.sage' checks the cases where omega = 9 and the power of 5 that exactly divides n is not among 5^2, 5^4, 5^6, 5^8, 5^10, 5^12, and 5^46. In each checked case, the power of 5 that exactly divides n is specified.

Output files
------------

Each item of the following list contains the name of an output file, a short explanation of what the output file represents, and the line that was typed into SageMath to generate the output file.

'outputOmega5NotPrintFull.txt' (search for candidate partial prime factorisations where omega = 5):
load('sageSolX.sage'); o = open('outputOmega5NotPrintFull.txt', 'w'); t = cputime(); nextBranch(o, 9/5, 9/5, 5, 0, [], [], 0, [], [], 10 ** 3, 4, [3], False); o.write('(end)\n'); o.write('Time: '); o.write(str(cputime(t))); o.write(' seconds'); o.close()

'outputOmega6NotPrintFull.txt' (search for candidate partial prime factorisations where omega = 6):
load('sageSolX.sage'); o = open('outputOmega6NotPrintFull.txt', 'w'); t = cputime(); nextBranch(o, 9/5, 9/5, 6, 0, [], [], 0, [], [], 10 ** 7, 4, [3], False); o.write('(end)\n'); o.write('Time: '); o.write(str(cputime(t))); o.write(' seconds'); o.close()

'outputOmega7NotPrintFull.txt' (search for candidate partial prime factorisations where omega = 7):
load('sageSolX.sage'); o = open('outputOmega7NotPrintFull.txt', 'w'); t = cputime(); nextBranch(o, 9/5, 9/5, 7, 0, [], [], 0, [], [], 10 ** 14, 4, [3], False); o.write('(end)\n'); o.write('Time: '); o.write(str(cputime(t))); o.write(' seconds'); o.close()

'outputOmega8NotPrintFull.txt' (long search for candidate partial prime factorisations where omega = 8):
load('sageSolX.sage'); o = open('outputOmega8NotPrintFull.txt', 'w'); t = cputime(); nextBranch(o, 9/5, 9/5, 8, 0, [], [], 0, [], [], 10 ** 29, 4, [3], False); o.write('(end)\n'); o.write('Time: '); o.write(str(cputime(t))); o.write(' seconds'); o.close()

'outputOmega8CheckPwrsOf5.txt' (short search for candidate partial prime factorisations where omega = 8):
load('inputOmega8CheckPwrsOf5.sage')

'outputOmega9Base5Pwr02CheckPwrsOf31.txt' (search for candidate partial prime factorisations where omega = 9, 5^2 exactly divides n, and 31^96 does not divide n):
load('inputOmega9Base5Pwr02CheckPwrsOf31.sage')

'outputOmega9Sp2_31.txt' (search for candidate partial prime factorisations where omega = 9, 5^2 exactly divides n, and 31^96 divides n, using 31 as a special prime):
load('sageSolXSpecial2.sage'); o = open('outputOmega9Sp2_31.txt', 'w'); t = cputime(); nextBranchSp2(o, 31, 1, 31 ** 14, 1, 9/5, 9/5, 9, 2, [5, 31], [2, 95], [1, 0], 0, [], [], [], 10 ** 16, 5, [3], False); o.write('(end)\n'); o.write('Time: '); o.write(str(cputime(t))); o.write(' seconds'); o.close()

'outputOmega9Base5Pwr06CheckPwrsOf19531.txt' (search for candidate partial prime factorisations where omega = 9, 5^6 exactly divides n, and 19531^88 does not divide n):
load('inputOmega9Base5Pwr06CheckPwrsOf19531.sage')

'outputOmega9Sp2_19531.txt' (search for candidate partial prime factorisations where omega = 9, 5^6 exactly divides n, and 19531^88 divides n, using 19531 as a special prime):
load('sageSolXSpecial2.sage'); o = open('outputOmega9Sp2_19531.txt', 'w'); t = cputime(); nextBranchSp2(o, 19531, 1, 19531 ** 6, 1, 9/5, 9/5, 9, 2, [5, 19531], [6, 87], [1, 0], 0, [], [], [], 10 ** 17, 5, [3], False); o.write('(end)\n'); o.write('Time: '); o.write(str(cputime(t))); o.write(' seconds'); o.close()

(Note: 5^7 = 19531(4) + 1, so 5^7 == 1 mod 19531, so o_{19531}(5) = 7 and v_{19531}(5^7 - 1) = 1.)

'outputOmega9Base5Pwr04.txt' (search for candidate partial prime factorisations where omega = 9 and 5^4 exactly divides n):
load('sageSolX.sage'); o = open('outputOmega9Base5Pwr04.txt', 'w'); t = cputime(); nextBranch(o, 9/5, 9/5, 9, 1, [5], [4], 2, [11, 71], [1, 1], 10 ** 18, 5, [3], False); o.write('(end)\n'); o.write('Time: '); o.write(str(cputime(t))); o.write(' seconds'); o.close()

'outputOmega9Base5Pwr08.txt' (search for candidate partial prime factorisations where omega = 9 and 5^8 exactly divides n):
load('sageSolX.sage'); o = open('outputOmega9Base5Pwr08.txt', 'w'); t = cputime(); nextBranch(o, 9/5, 9/5, 9, 1, [5], [8], 3, [19, 31, 829], [1, 1, 1], 10 ** 11, 5, [3], False); o.write('(end)\n'); o.write('Time: '); o.write(str(cputime(t))); o.write(' seconds'); o.close()

'outputOmega9Base5Pwr10.txt' (search for candidate partial prime factorisations where omega = 9 and 5^10 exactly divides n):
load('sageSolX.sage'); o = open('outputOmega9Base5Pwr10.txt', 'w'); t = cputime(); nextBranch(o, 9/5, 9/5, 9, 1, [5], [10], 1, [((5 ** 11) - 1) // 4], [1], 10 ** 29, 5, [3], False); o.write('(end)\n'); o.write('Time: '); o.write(str(cputime(t))); o.write(' seconds'); o.close()

'outputOmega9Base5Pwr12.txt' (search for candidate partial prime factorisations where omega = 9 and 5^12 exactly divides n):
load('sageSolX.sage'); o = open('outputOmega9Base5Pwr12.txt', 'w'); t = cputime(); nextBranch(o, 9/5, 9/5, 9, 1, [5], [12], 1, [((5 ** 13) - 1) // 4], [1], 10 ** 29, 5, [3], False); o.write('(end)\n'); o.write('Time: '); o.write(str(cputime(t))); o.write(' seconds'); o.close()

'outputOmega9Base5Pwr46.txt' (search for candidate partial prime factorisations where omega = 9 and 5^46 exactly divides n):
load('sageSolX.sage'); o = open('outputOmega9Base5Pwr46.txt', 'w'); t = cputime(); nextBranch(o, 9/5, 9/5, 9, 1, [5], [46], 1, [((5 ** 47) - 1) // 4], [1], 10 ** 29, 5, [3], False); o.write('(end)\n'); o.write('Time: '); o.write(str(cputime(t))); o.write(' seconds'); o.close()

'outputOmega9CheckPwrsOf5.txt' (search for candidate partial prime factorisations where omega = 9 and the power of 5 that exactly divides n is not among 5^2, 5^4, 5^6, 5^8, 5^10, 5^12, and 5^46):
load('inputOmega9CheckPwrsOf5.sage')

(end of list of output files)
