Combination product sets

Given the list of numbers [1, 3, 5, 7], take all products of two numbers,

1*3, 1*5, 1*7, 3*5, 3*7, 5*7

Now pick one of these products as the root, say 3. Divide each number by the root

1, 5/3, 7/3, 5, 7, 35/3

and reduce within one octave

1, 5/3, 7/6, 5/4, 7/4, 35/24

These ratios 1, 7/6, 5/4, 35/24, 5/3, 7/4 form the 1-3-5-7 hexany.

Choosing different products as root gives different modes of the same scale.

In general, given a list of n numbers, taking products of k numbers gives a CPS written nCk. The scale gets a name based on its number of tones:

Name Tones
monany 1
dyany 2
triany 3
tetrany 4
pentany 5
hexany 6
dekany 10
pentadekany 15
eikosany 20

Further reading

Python code
from itertools import combinations
from fractions import Fraction
from math import floor, log2, prod


def reduce(x):
    return x * Fraction(2) ** (-floor(log2(x)))


def cps(A, k, *, root=None):
    """
    >>> cps([1, 3, 5, 7], 2)
    [Fraction(1, 1), Fraction(7, 6), Fraction(5, 4), Fraction(35, 24), Fraction(5, 3), Fraction(7, 4)]
    """
    products = [Fraction(prod(a)) for a in combinations(A, k)]
    if root is None:
        root = products[0]
    return sorted(reduce(x / root) for x in products)

Scales

FileCall
xen12-wilson-02-hexany cps([3, 5, 7, 11], 2, root=5*7)
xen12-wilson-06c-4C1-tetrany cps([3, 5, 7, 11], 1)
xen12-wilson-06c-4C3-tetrany cps([3, 5, 7, 11], 3)
xen12-wilson-07-eikosany cps([1, 3, 7, 9, 11, 15], 3, root=1*9*11)
xen12-wilson-07-eikosany-extended
xen12-wilson-08-4C1-tetrany-00 cps([1, 3, 7, 9], 1)
xen12-wilson-08-4C1-tetrany-01 cps([1, 3, 7, 11], 1)
xen12-wilson-08-4C1-tetrany-02 cps([1, 3, 7, 15], 1)
xen12-wilson-08-4C1-tetrany-03 cps([1, 3, 9, 11], 1)
xen12-wilson-08-4C1-tetrany-04 cps([1, 3, 9, 15], 1)
xen12-wilson-08-4C1-tetrany-05 cps([1, 3, 11, 15], 1)
xen12-wilson-08-4C1-tetrany-06 cps([1, 7, 9, 11], 1)
xen12-wilson-08-4C1-tetrany-07 cps([1, 7, 9, 15], 1)
xen12-wilson-08-4C1-tetrany-08 cps([1, 7, 11, 15], 1)
xen12-wilson-08-4C1-tetrany-09 cps([1, 9, 11, 15], 1)
xen12-wilson-08-4C1-tetrany-10 cps([3, 7, 9, 11], 1)
xen12-wilson-08-4C1-tetrany-11 cps([3, 7, 9, 15], 1)
xen12-wilson-08-4C1-tetrany-12 cps([3, 7, 11, 15], 1)
xen12-wilson-08-4C1-tetrany-13 cps([3, 9, 11, 15], 1)
xen12-wilson-08-4C1-tetrany-14 cps([7, 9, 11, 15], 1)
xen12-wilson-08-4C3-tetrany-00 cps([1, 3, 7, 9], 3)
xen12-wilson-08-4C3-tetrany-01 cps([1, 3, 7, 11], 3)
xen12-wilson-08-4C3-tetrany-02 cps([1, 3, 7, 15], 3)
xen12-wilson-08-4C3-tetrany-03 cps([1, 3, 9, 11], 3)
xen12-wilson-08-4C3-tetrany-04 cps([1, 3, 9, 15], 3)
xen12-wilson-08-4C3-tetrany-05 cps([1, 3, 11, 15], 3)
xen12-wilson-08-4C3-tetrany-06 cps([1, 7, 9, 11], 3)
xen12-wilson-08-4C3-tetrany-07 cps([1, 7, 9, 15], 3)
xen12-wilson-08-4C3-tetrany-08 cps([1, 7, 11, 15], 3)
xen12-wilson-08-4C3-tetrany-09 cps([1, 9, 11, 15], 3)
xen12-wilson-08-4C3-tetrany-10 cps([3, 7, 9, 11], 3)
xen12-wilson-08-4C3-tetrany-11 cps([3, 7, 9, 15], 3)
xen12-wilson-08-4C3-tetrany-12 cps([3, 7, 11, 15], 3)
xen12-wilson-08-4C3-tetrany-13 cps([3, 9, 11, 15], 3)
xen12-wilson-08-4C3-tetrany-14 cps([7, 9, 11, 15], 3)
xen12-wilson-09-4C2-hexany-00 cps([1, 3, 7, 9], 2)
xen12-wilson-09-4C2-hexany-01 cps([1, 3, 7, 11], 2)
xen12-wilson-09-4C2-hexany-02 cps([1, 3, 7, 15], 2)
xen12-wilson-09-4C2-hexany-03 cps([1, 3, 9, 11], 2)
xen12-wilson-09-4C2-hexany-04 cps([1, 3, 9, 15], 2)
xen12-wilson-09-4C2-hexany-05 cps([1, 3, 11, 15], 2)
xen12-wilson-09-4C2-hexany-06 cps([1, 7, 9, 11], 2)
xen12-wilson-09-4C2-hexany-07 cps([1, 7, 9, 15], 2)
xen12-wilson-09-4C2-hexany-08 cps([1, 7, 11, 15], 2)
xen12-wilson-09-4C2-hexany-09 cps([1, 9, 11, 15], 2)
xen12-wilson-09-4C2-hexany-10 cps([3, 7, 9, 11], 2)
xen12-wilson-09-4C2-hexany-11 cps([3, 7, 9, 15], 2)
xen12-wilson-09-4C2-hexany-12 cps([3, 7, 11, 15], 2)
xen12-wilson-09-4C2-hexany-13 cps([3, 9, 11, 15], 2)
xen12-wilson-09-4C2-hexany-14 cps([7, 9, 11, 15], 2)
xen12-wilson-13-eikosany cps([1, 3, 5, 7, 9, 11], 3)
xen12-wilson-25-6C1-hexany cps([1, 3, 5, 7, 9, 11], 1)
xen12-wilson-25-6C2-pentadekany cps([1, 3, 5, 7, 9, 11], 2, root=3*11)
xen12-wilson-25-6C3-eikosany cps([1, 3, 5, 7, 9, 11], 3, root=1*3*11)
xen12-wilson-25-6C4-pentadekany cps([1, 3, 5, 7, 9, 11], 4, root=3*7*9*11)
xen12-wilson-25-6C5-hexany cps([1, 3, 5, 7, 9, 11], 5, root=1*3*7*9*11)
xen12-wilson-32-dekany cps([1, 5, 7, 11, 15], 2)
xen12-wilson-33-dekany cps([1, 5, 7, 11, 15], 3)
xen12-wilson-38-4C1-tetrany-00 cps([1, 3, 5, 7], 1)
xen12-wilson-38-4C1-tetrany-01 cps([1, 3, 5, 9], 1)
xen12-wilson-38-4C1-tetrany-02 cps([1, 3, 5, 11], 1)
xen12-wilson-38-4C1-tetrany-06 cps([1, 5, 7, 9], 1)
xen12-wilson-38-4C1-tetrany-07 cps([1, 5, 7, 11], 1)
xen12-wilson-38-4C1-tetrany-08 cps([1, 5, 9, 11], 1)
xen12-wilson-38-4C1-tetrany-10 cps([3, 5, 7, 9], 1)
xen12-wilson-38-4C1-tetrany-11 cps([3, 5, 7, 11], 1)
xen12-wilson-38-4C1-tetrany-12 cps([3, 5, 9, 11], 1)
xen12-wilson-38-4C1-tetrany-14 cps([5, 7, 9, 11], 1)
xen12-wilson-38-4C3-tetrany-00 cps([1, 3, 5, 7], 3)
xen12-wilson-38-4C3-tetrany-01 cps([1, 3, 5, 9], 3)
xen12-wilson-38-4C3-tetrany-02 cps([1, 3, 5, 11], 3)
xen12-wilson-38-4C3-tetrany-06 cps([1, 5, 7, 9], 3)
xen12-wilson-38-4C3-tetrany-07 cps([1, 5, 7, 11], 3)
xen12-wilson-38-4C3-tetrany-08 cps([1, 5, 9, 11], 3)
xen12-wilson-38-4C3-tetrany-10 cps([3, 5, 7, 9], 3)
xen12-wilson-38-4C3-tetrany-11 cps([3, 5, 7, 11], 3)
xen12-wilson-38-4C3-tetrany-12 cps([3, 5, 9, 11], 3)
xen12-wilson-38-4C3-tetrany-14 cps([5, 7, 9, 11], 3)
xen12-wilson-39-4C2-hexany-00 cps([1, 3, 5, 7], 2)
xen12-wilson-39-4C2-hexany-01 cps([1, 3, 5, 9], 2)
xen12-wilson-39-4C2-hexany-02 cps([1, 3, 5, 11], 2)
xen12-wilson-39-4C2-hexany-06 cps([1, 5, 7, 9], 2)
xen12-wilson-39-4C2-hexany-07 cps([1, 5, 7, 11], 2)
xen12-wilson-39-4C2-hexany-08 cps([1, 5, 9, 11], 2)
xen12-wilson-39-4C2-hexany-10 cps([3, 5, 7, 9], 2)
xen12-wilson-39-4C2-hexany-11 cps([3, 5, 7, 11], 2)
xen12-wilson-39-4C2-hexany-12 cps([3, 5, 9, 11], 2)
xen12-wilson-39-4C2-hexany-14 cps([5, 7, 9, 11], 2)
xen12-wilson-40-5C2-dekany-00 cps([1, 3, 5, 7, 9], 2)
xen12-wilson-40-5C2-dekany-01 cps([1, 3, 5, 7, 11], 2)
xen12-wilson-40-5C2-dekany-02 cps([1, 3, 5, 9, 11], 2)
xen12-wilson-40-5C2-dekany-03 cps([1, 3, 7, 9, 11], 2)
xen12-wilson-40-5C2-dekany-04 cps([1, 5, 7, 9, 11], 2)
xen12-wilson-40-5C2-dekany-05 cps([3, 5, 7, 9, 11], 2)
xen12-wilson-40-5C3-dekany-00 cps([1, 3, 5, 7, 9], 3)
xen12-wilson-40-5C3-dekany-01 cps([1, 3, 5, 7, 11], 3)
xen12-wilson-40-5C3-dekany-02 cps([1, 3, 5, 9, 11], 3)
xen12-wilson-40-5C3-dekany-03 cps([1, 3, 7, 9, 11], 3)
xen12-wilson-40-5C3-dekany-04 cps([1, 5, 7, 9, 11], 3)
xen12-wilson-40-5C3-dekany-05 cps([3, 5, 7, 9, 11], 3)