--- /dev/null
+#!/usr/bin/env python3
+
+import random
+
+def prod(vec):
+ result = 1
+ for n in vec:
+ result *= n
+ return result
+
+# 2 × (2 × 3 × 5) × 5 × (11 × 17) × 239 = 2 × 30 × 5 × 187 × 239 = 13407900
+factors = [3, 11, 17, 19, 37] #[2, 3, 3, 5, 11, 17, 239]
+
+done_segments = set()
+for line in range(12):
+ while True:
+ segments = []
+ i = 0
+ while i < len(factors):
+ j = random.randint(1, len(factors) - i)
+ segments.append(j)
+ i += j
+ for i in range(len(segments) - 1):
+ j = random.randint(i, len(segments) - 1)
+ segments[i], segments[j] = segments[j], segments[i]
+ assert sum(segments) == len(factors)
+ if (
+ len(segments) >= 3 and
+ len(segments) < len(factors) and
+ tuple(segments) not in done_segments
+ ):
+ break
+ done_segments.add(tuple(segments))
+
+ long_form = []
+ short_form = []
+ i = 0
+ for j in segments:
+ factor = ' × '.join([str(k) for k in factors[i:i + j]])
+ if j > 1:
+ factor = '(' + factor + ')'
+ long_form.append(factor)
+ short_form.append(str(prod(factors[i:i + j])))
+ i += j
+ long_form = ' × '.join(long_form)
+ short_form = ' × '.join(short_form)
+ answer = str(prod(factors))
+
+ print(long_form + ' = ' + short_form + ' = ' + answer)