FA-63476 / Actuarial life tables / Open access
Term insurance net single premium: A term equal to the table length is rejected · case 01
A term that uses every tabulated rate returns table too short.
ROOT CAUSE
The length check is inclusive.
VERIFIED REPAIR
Reject only terms longer than the table.
Unsuccessful approach: Rejecting zero-year terms refuses a valid degenerate term.
Case contract
Input q (per 100000 from the issue age), n, i (per mille), benefit (cents), timing eoy|immediate. n > table length -> 'table too short'. A = sum_{k<n} v^(k+1) kp q_k with exact rationals; immediate payment multiplies benefit*A by i/ln(1+i). Return the premium in cents rounded half-up.
Why this case matters
Life-table arithmetic compounds across ages, so one misplaced index or assumption shifts every downstream value.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
import math
from fractions import Fraction
N = 1
observations = []
def solve(x):
qs=[Fraction(q,100000) for q in x['q']]
n=x['n']
if n>=len(qs): return 'table too short'
i=Fraction(x['i'],1000); v=1/(1+i)
A=Fraction(0); kp=Fraction(1)
for k in range(n):
A+=v**(k+1)*kp*qs[k]
kp*=1-qs[k]
val=x['benefit']*A
if x['timing']=='immediate':
val=float(val)*float(i)/math.log(1+float(i))
return math.floor(val+Fraction(1,2)) if not isinstance(val,float) else math.floor(val+0.5)
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['five-year term year-end', {'q': [1120, 1440, 1834, 2319, 2899, 3653, 4570, 5749, 7212, 9035], 'n': 5, 'i': 30, 'benefit': 297462334, 'timing': 'eoy'}, 24907301], ['ten-year term immediate', {'q': [1229, 1536, 1954, 2473, 3129, 3926, 4951, 6230, 7798, 9775], 'n': 10, 'i': 30, 'benefit': 684088327, 'timing': 'immediate'}, 203032132], ['term equals table length', {'q': [1992, 2493, 3139, 3954, 4989, 6283, 7890, 9875, 12347, 15472], 'n': 10, 'i': 45, 'benefit': 756656210, 'timing': 'eoy'}, 290009324], ['term longer than table', {'q': [1731, 2169, 2759, 3498, 4390, 5528, 6955, 8697, 10895, 13668], 'n': 11, 'i': 30, 'benefit': 613954502, 'timing': 'eoy'}, 'table too short'], ['zero-year term', {'q': [1687, 2109, 2681, 3387, 4278, 5370, 6761, 8476, 10642, 13344], 'n': 0, 'i': 60, 'benefit': 884542546, 'timing': 'eoy'}, 0], ['one-year term', {'q': [1075, 1358, 1730, 2192, 2777, 3500, 4397, 5544, 6939, 8709], 'n': 1, 'i': 30, 'benefit': 1000000007, 'timing': 'eoy'}, 10436893], ['large face amount', {'q': [1332, 1682, 2121, 2652, 3332, 4208, 5307, 6656, 8328, 10452], 'n': 7, 'i': 30, 'benefit': 7043659579, 'timing': 'eoy'}, 1160570167], ['immediate short term', {'q': [1485, 1888, 2378, 2991, 3778, 4731, 5935, 7422, 9291, 11653], 'n': 3, 'i': 50, 'benefit': 365125009, 'timing': 'immediate'}, 19033810]], [['five-year term year-end', {'q': [2116, 2656, 3333, 4187, 5233, 6563, 8245, 10342, 12947, 16215], 'n': 5, 'i': 30, 'benefit': 276975028, 'timing': 'eoy'}, 41051826], ['ten-year term immediate', {'q': [1811, 2303, 2910, 3645, 4586, 5762, 7212, 9047, 11354, 14214], 'n': 10, 'i': 60, 'benefit': 378515675, 'timing': 'immediate'}, 127823658], ['term equals table length', {'q': [2118, 2677, 3391, 4262, 5345, 6725, 8419, 10545, 13184, 16505], 'n': 10, 'i': 45, 'benefit': 692594078, 'timing': 'eoy'}, 278847031], ['term longer than table', {'q': [896, 1152, 1459, 1856, 2366, 3001, 3800, 4800, 6029, 7549], 'n': 11, 'i': 60, 'benefit': 734220350, 'timing': 'eoy'}, 'table too short'], ['zero-year term', {'q': [1067, 1347, 1702, 2149, 2735, 3424, 4300, 5419, 6795, 8513], 'n': 0, 'i': 45, 'benefit': 573820538, 'timing': 'eoy'}, 0], ['one-year term', {'q': [1384, 1780, 2238, 2803, 3516, 4419, 5557, 6972, 8758, 10991], 'n': 1, 'i': 30, 'benefit': 1000000014, 'timing': 'eoy'}, 13436893], ['large face amount', {'q': [2149, 2700, 3375, 4238, 5308, 6659, 8372, 10480, 13113, 16421], 'n': 8, 'i': 45, 'benefit': 8475119998, 'timing': 'eoy'}, 2426184535], ['immediate short term', {'q': [1930, 2425, 3075, 3847, 4814, 6063, 7606, 9533, 11922, 14937], 'n': 3, 'i': 50, 'benefit': 708486332, 'timing': 'immediate'}, 47462561]], [['five-year term year-end', {'q': [1799, 2257, 2859, 3588, 4485, 5615, 7030, 8808, 11037, 13815], 'n': 5, 'i': 60, 'benefit': 167620781, 'timing': 'eoy'}, 19505270], ['ten-year term immediate', {'q': [2195, 2744, 3480, 4385, 5523, 6927, 8702, 10910, 13687, 17121], 'n': 10, 'i': 60, 'benefit': 668677245, 'timing': 'immediate'}, 259300273], ['term equals table length', {'q': [1956, 2493, 3138, 3967, 5005, 6257, 7823, 9787, 12266, 15359], 'n': 10, 'i': 45, 'benefit': 282702347, 'timing': 'eoy'}, 107920351], ['term longer than table', {'q': [2134, 2688, 3394, 4247, 5345, 6699, 8380, 10517, 13186, 16496], 'n': 11, 'i': 45, 'benefit': 136081264, 'timing': 'eoy'}, 'table too short'], ['zero-year term', {'q': [1138, 1426, 1819, 2273, 2872, 3634, 4574, 5753, 7197, 9042], 'n': 0, 'i': 30, 'benefit': 668817925, 'timing': 'eoy'}, 0], ['one-year term', {'q': [2207, 2761, 3485, 4400, 5510, 6912, 8685, 10885, 13650, 17091], 'n': 1, 'i': 60, 'benefit': 1000000021, 'timing': 'eoy'}, 20820755], ['large face amount', {'q': [1675, 2113, 2648, 3323, 4166, 5241, 6590, 8244, 10352, 12961], 'n': 8, 'i': 45, 'benefit': 5179542771, 'timing': 'eoy'}, 1207339201], ['immediate short term', {'q': [2261, 2837, 3571, 4509, 5663, 7114, 8900, 11135, 13947, 17461], 'n': 3, 'i': 50, 'benefit': 148092738, 'timing': 'immediate'}, 11530914]], [['five-year term year-end', {'q': [1372, 1750, 2200, 2793, 3528, 4456, 5617, 7060, 8864, 11121], 'n': 5, 'i': 60, 'benefit': 671460915, 'timing': 'eoy'}, 61409725], ['ten-year term immediate', {'q': [1483, 1891, 2391, 3003, 3797, 4757, 5974, 7507, 9411, 11782], 'n': 10, 'i': 45, 'benefit': 110078003, 'timing': 'immediate'}, 34888554], ['term equals table length', {'q': [2202, 2760, 3467, 4334, 5421, 6813, 8558, 10718, 13399, 16772], 'n': 10, 'i': 30, 'benefit': 761103905, 'timing': 'eoy'}, 340778826], ['term longer than table', {'q': [895, 1146, 1437, 1841, 2324, 2934, 3673, 4605, 5775, 7226], 'n': 11, 'i': 60, 'benefit': 612398678, 'timing': 'eoy'}, 'table too short'], ['zero-year term', {'q': [2071, 2616, 3274, 4106, 5164, 6501, 8167, 10248, 12843, 16103], 'n': 0, 'i': 30, 'benefit': 615700164, 'timing': 'eoy'}, 0], ['one-year term', {'q': [1630, 2082, 2630, 3305, 4153, 5203, 6508, 8173, 10245, 12826], 'n': 1, 'i': 60, 'benefit': 1000000028, 'timing': 'eoy'}, 15377359], ['large face amount', {'q': [1055, 1320, 1681, 2105, 2671, 3374, 4252, 5326, 6705, 8431], 'n': 8, 'i': 45, 'benefit': 6631603996, 'timing': 'eoy'}, 1038053345], ['immediate short term', {'q': [1585, 2009, 2540, 3175, 3980, 4989, 6278, 7848, 9822, 12302], 'n': 3, 'i': 50, 'benefit': 128139603, 'timing': 'immediate'}, 7115877]], [['five-year term year-end', {'q': [1585, 2015, 2541, 3196, 4029, 5069, 6349, 7942, 9963, 12472], 'n': 5, 'i': 30, 'benefit': 501144892, 'timing': 'eoy'}, 57536772], ['ten-year term immediate', {'q': [1239, 1548, 1962, 2463, 3080, 3877, 4882, 6122, 7676, 9611], 'n': 10, 'i': 60, 'benefit': 778238927, 'timing': 'immediate'}, 191663547], ['term equals table length', {'q': [1964, 2482, 3120, 3944, 4977, 6261, 7873, 9861, 12344, 15433], 'n': 10, 'i': 60, 'benefit': 912336104, 'timing': 'eoy'}, 318422653], ['term longer than table', {'q': [1113, 1425, 1788, 2240, 2841, 3583, 4528, 5705, 7149, 8939], 'n': 11, 'i': 60, 'benefit': 546287061, 'timing': 'eoy'}, 'table too short'], ['zero-year term', {'q': [1052, 1329, 1686, 2145, 2692, 3399, 4294, 5409, 6806, 8522], 'n': 0, 'i': 45, 'benefit': 558349824, 'timing': 'eoy'}, 0], ['one-year term', {'q': [1695, 2147, 2715, 3434, 4318, 5402, 6762, 8454, 10583, 13270], 'n': 1, 'i': 30, 'benefit': 1000000035, 'timing': 'eoy'}, 16456311], ['large face amount', {'q': [2159, 2724, 3446, 4334, 5433, 6813, 8566, 10749, 13458, 16871], 'n': 8, 'i': 60, 'benefit': 6554802467, 'timing': 'eoy'}, 1774398066], ['immediate short term', {'q': [1616, 2039, 2564, 3251, 4064, 5090, 6396, 8010, 10020, 12534], 'n': 3, 'i': 50, 'benefit': 976296817, 'timing': 'immediate'}, 54960278]]]
for label, args, expected in fixtures[N-1]:
check(label, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| five-year term year-end | 24907301 | 24907301 | Passed |
| ten-year term immediate | table too short | 203032132 | Failed |
| term equals table length | table too short | 290009324 | Failed |
| term longer than table | table too short | table too short | Passed |
| zero-year term | 0 | 0 | Passed |
| one-year term | 10436893 | 10436893 | Passed |
| large face amount | 1160570167 | 1160570167 | Passed |
| immediate short term | 19033810 | 19033810 | Passed |
SHA-256 / 70f23a2ffe18bf1ee224977179e29339a5bf217ca92f0c6163572406a42432c7
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
import math
from fractions import Fraction
N = 1
observations = []
def solve(x):
qs=[Fraction(q,100000) for q in x['q']]
n=x['n']
if n>len(qs) or n==0: return 'table too short'
i=Fraction(x['i'],1000); v=1/(1+i)
A=Fraction(0); kp=Fraction(1)
for k in range(n):
A+=v**(k+1)*kp*qs[k]
kp*=1-qs[k]
val=x['benefit']*A
if x['timing']=='immediate':
val=float(val)*float(i)/math.log(1+float(i))
return math.floor(val+Fraction(1,2)) if not isinstance(val,float) else math.floor(val+0.5)
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['five-year term year-end', {'q': [1120, 1440, 1834, 2319, 2899, 3653, 4570, 5749, 7212, 9035], 'n': 5, 'i': 30, 'benefit': 297462334, 'timing': 'eoy'}, 24907301], ['ten-year term immediate', {'q': [1229, 1536, 1954, 2473, 3129, 3926, 4951, 6230, 7798, 9775], 'n': 10, 'i': 30, 'benefit': 684088327, 'timing': 'immediate'}, 203032132], ['term equals table length', {'q': [1992, 2493, 3139, 3954, 4989, 6283, 7890, 9875, 12347, 15472], 'n': 10, 'i': 45, 'benefit': 756656210, 'timing': 'eoy'}, 290009324], ['term longer than table', {'q': [1731, 2169, 2759, 3498, 4390, 5528, 6955, 8697, 10895, 13668], 'n': 11, 'i': 30, 'benefit': 613954502, 'timing': 'eoy'}, 'table too short'], ['zero-year term', {'q': [1687, 2109, 2681, 3387, 4278, 5370, 6761, 8476, 10642, 13344], 'n': 0, 'i': 60, 'benefit': 884542546, 'timing': 'eoy'}, 0], ['one-year term', {'q': [1075, 1358, 1730, 2192, 2777, 3500, 4397, 5544, 6939, 8709], 'n': 1, 'i': 30, 'benefit': 1000000007, 'timing': 'eoy'}, 10436893], ['large face amount', {'q': [1332, 1682, 2121, 2652, 3332, 4208, 5307, 6656, 8328, 10452], 'n': 7, 'i': 30, 'benefit': 7043659579, 'timing': 'eoy'}, 1160570167], ['immediate short term', {'q': [1485, 1888, 2378, 2991, 3778, 4731, 5935, 7422, 9291, 11653], 'n': 3, 'i': 50, 'benefit': 365125009, 'timing': 'immediate'}, 19033810]], [['five-year term year-end', {'q': [2116, 2656, 3333, 4187, 5233, 6563, 8245, 10342, 12947, 16215], 'n': 5, 'i': 30, 'benefit': 276975028, 'timing': 'eoy'}, 41051826], ['ten-year term immediate', {'q': [1811, 2303, 2910, 3645, 4586, 5762, 7212, 9047, 11354, 14214], 'n': 10, 'i': 60, 'benefit': 378515675, 'timing': 'immediate'}, 127823658], ['term equals table length', {'q': [2118, 2677, 3391, 4262, 5345, 6725, 8419, 10545, 13184, 16505], 'n': 10, 'i': 45, 'benefit': 692594078, 'timing': 'eoy'}, 278847031], ['term longer than table', {'q': [896, 1152, 1459, 1856, 2366, 3001, 3800, 4800, 6029, 7549], 'n': 11, 'i': 60, 'benefit': 734220350, 'timing': 'eoy'}, 'table too short'], ['zero-year term', {'q': [1067, 1347, 1702, 2149, 2735, 3424, 4300, 5419, 6795, 8513], 'n': 0, 'i': 45, 'benefit': 573820538, 'timing': 'eoy'}, 0], ['one-year term', {'q': [1384, 1780, 2238, 2803, 3516, 4419, 5557, 6972, 8758, 10991], 'n': 1, 'i': 30, 'benefit': 1000000014, 'timing': 'eoy'}, 13436893], ['large face amount', {'q': [2149, 2700, 3375, 4238, 5308, 6659, 8372, 10480, 13113, 16421], 'n': 8, 'i': 45, 'benefit': 8475119998, 'timing': 'eoy'}, 2426184535], ['immediate short term', {'q': [1930, 2425, 3075, 3847, 4814, 6063, 7606, 9533, 11922, 14937], 'n': 3, 'i': 50, 'benefit': 708486332, 'timing': 'immediate'}, 47462561]], [['five-year term year-end', {'q': [1799, 2257, 2859, 3588, 4485, 5615, 7030, 8808, 11037, 13815], 'n': 5, 'i': 60, 'benefit': 167620781, 'timing': 'eoy'}, 19505270], ['ten-year term immediate', {'q': [2195, 2744, 3480, 4385, 5523, 6927, 8702, 10910, 13687, 17121], 'n': 10, 'i': 60, 'benefit': 668677245, 'timing': 'immediate'}, 259300273], ['term equals table length', {'q': [1956, 2493, 3138, 3967, 5005, 6257, 7823, 9787, 12266, 15359], 'n': 10, 'i': 45, 'benefit': 282702347, 'timing': 'eoy'}, 107920351], ['term longer than table', {'q': [2134, 2688, 3394, 4247, 5345, 6699, 8380, 10517, 13186, 16496], 'n': 11, 'i': 45, 'benefit': 136081264, 'timing': 'eoy'}, 'table too short'], ['zero-year term', {'q': [1138, 1426, 1819, 2273, 2872, 3634, 4574, 5753, 7197, 9042], 'n': 0, 'i': 30, 'benefit': 668817925, 'timing': 'eoy'}, 0], ['one-year term', {'q': [2207, 2761, 3485, 4400, 5510, 6912, 8685, 10885, 13650, 17091], 'n': 1, 'i': 60, 'benefit': 1000000021, 'timing': 'eoy'}, 20820755], ['large face amount', {'q': [1675, 2113, 2648, 3323, 4166, 5241, 6590, 8244, 10352, 12961], 'n': 8, 'i': 45, 'benefit': 5179542771, 'timing': 'eoy'}, 1207339201], ['immediate short term', {'q': [2261, 2837, 3571, 4509, 5663, 7114, 8900, 11135, 13947, 17461], 'n': 3, 'i': 50, 'benefit': 148092738, 'timing': 'immediate'}, 11530914]], [['five-year term year-end', {'q': [1372, 1750, 2200, 2793, 3528, 4456, 5617, 7060, 8864, 11121], 'n': 5, 'i': 60, 'benefit': 671460915, 'timing': 'eoy'}, 61409725], ['ten-year term immediate', {'q': [1483, 1891, 2391, 3003, 3797, 4757, 5974, 7507, 9411, 11782], 'n': 10, 'i': 45, 'benefit': 110078003, 'timing': 'immediate'}, 34888554], ['term equals table length', {'q': [2202, 2760, 3467, 4334, 5421, 6813, 8558, 10718, 13399, 16772], 'n': 10, 'i': 30, 'benefit': 761103905, 'timing': 'eoy'}, 340778826], ['term longer than table', {'q': [895, 1146, 1437, 1841, 2324, 2934, 3673, 4605, 5775, 7226], 'n': 11, 'i': 60, 'benefit': 612398678, 'timing': 'eoy'}, 'table too short'], ['zero-year term', {'q': [2071, 2616, 3274, 4106, 5164, 6501, 8167, 10248, 12843, 16103], 'n': 0, 'i': 30, 'benefit': 615700164, 'timing': 'eoy'}, 0], ['one-year term', {'q': [1630, 2082, 2630, 3305, 4153, 5203, 6508, 8173, 10245, 12826], 'n': 1, 'i': 60, 'benefit': 1000000028, 'timing': 'eoy'}, 15377359], ['large face amount', {'q': [1055, 1320, 1681, 2105, 2671, 3374, 4252, 5326, 6705, 8431], 'n': 8, 'i': 45, 'benefit': 6631603996, 'timing': 'eoy'}, 1038053345], ['immediate short term', {'q': [1585, 2009, 2540, 3175, 3980, 4989, 6278, 7848, 9822, 12302], 'n': 3, 'i': 50, 'benefit': 128139603, 'timing': 'immediate'}, 7115877]], [['five-year term year-end', {'q': [1585, 2015, 2541, 3196, 4029, 5069, 6349, 7942, 9963, 12472], 'n': 5, 'i': 30, 'benefit': 501144892, 'timing': 'eoy'}, 57536772], ['ten-year term immediate', {'q': [1239, 1548, 1962, 2463, 3080, 3877, 4882, 6122, 7676, 9611], 'n': 10, 'i': 60, 'benefit': 778238927, 'timing': 'immediate'}, 191663547], ['term equals table length', {'q': [1964, 2482, 3120, 3944, 4977, 6261, 7873, 9861, 12344, 15433], 'n': 10, 'i': 60, 'benefit': 912336104, 'timing': 'eoy'}, 318422653], ['term longer than table', {'q': [1113, 1425, 1788, 2240, 2841, 3583, 4528, 5705, 7149, 8939], 'n': 11, 'i': 60, 'benefit': 546287061, 'timing': 'eoy'}, 'table too short'], ['zero-year term', {'q': [1052, 1329, 1686, 2145, 2692, 3399, 4294, 5409, 6806, 8522], 'n': 0, 'i': 45, 'benefit': 558349824, 'timing': 'eoy'}, 0], ['one-year term', {'q': [1695, 2147, 2715, 3434, 4318, 5402, 6762, 8454, 10583, 13270], 'n': 1, 'i': 30, 'benefit': 1000000035, 'timing': 'eoy'}, 16456311], ['large face amount', {'q': [2159, 2724, 3446, 4334, 5433, 6813, 8566, 10749, 13458, 16871], 'n': 8, 'i': 60, 'benefit': 6554802467, 'timing': 'eoy'}, 1774398066], ['immediate short term', {'q': [1616, 2039, 2564, 3251, 4064, 5090, 6396, 8010, 10020, 12534], 'n': 3, 'i': 50, 'benefit': 976296817, 'timing': 'immediate'}, 54960278]]]
for label, args, expected in fixtures[N-1]:
check(label, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| five-year term year-end | 24907301 | 24907301 | Passed |
| ten-year term immediate | 203032132 | 203032132 | Passed |
| term equals table length | 290009324 | 290009324 | Passed |
| term longer than table | table too short | table too short | Passed |
| zero-year term | table too short | 0 | Failed |
| one-year term | 10436893 | 10436893 | Passed |
| large face amount | 1160570167 | 1160570167 | Passed |
| immediate short term | 19033810 | 19033810 | Passed |
SHA-256 / 8992d61d0328f3b096b457d0eaa59ade70c8437d44c0f26475d28eb42cd51d5b
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
import math
from fractions import Fraction
N = 1
observations = []
def solve(x):
qs=[Fraction(q,100000) for q in x['q']]
n=x['n']
if n>len(qs): return 'table too short'
i=Fraction(x['i'],1000); v=1/(1+i)
A=Fraction(0); kp=Fraction(1)
for k in range(n):
A+=v**(k+1)*kp*qs[k]
kp*=1-qs[k]
val=x['benefit']*A
if x['timing']=='immediate':
val=float(val)*float(i)/math.log(1+float(i))
return math.floor(val+Fraction(1,2)) if not isinstance(val,float) else math.floor(val+0.5)
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['five-year term year-end', {'q': [1120, 1440, 1834, 2319, 2899, 3653, 4570, 5749, 7212, 9035], 'n': 5, 'i': 30, 'benefit': 297462334, 'timing': 'eoy'}, 24907301], ['ten-year term immediate', {'q': [1229, 1536, 1954, 2473, 3129, 3926, 4951, 6230, 7798, 9775], 'n': 10, 'i': 30, 'benefit': 684088327, 'timing': 'immediate'}, 203032132], ['term equals table length', {'q': [1992, 2493, 3139, 3954, 4989, 6283, 7890, 9875, 12347, 15472], 'n': 10, 'i': 45, 'benefit': 756656210, 'timing': 'eoy'}, 290009324], ['term longer than table', {'q': [1731, 2169, 2759, 3498, 4390, 5528, 6955, 8697, 10895, 13668], 'n': 11, 'i': 30, 'benefit': 613954502, 'timing': 'eoy'}, 'table too short'], ['zero-year term', {'q': [1687, 2109, 2681, 3387, 4278, 5370, 6761, 8476, 10642, 13344], 'n': 0, 'i': 60, 'benefit': 884542546, 'timing': 'eoy'}, 0], ['one-year term', {'q': [1075, 1358, 1730, 2192, 2777, 3500, 4397, 5544, 6939, 8709], 'n': 1, 'i': 30, 'benefit': 1000000007, 'timing': 'eoy'}, 10436893], ['large face amount', {'q': [1332, 1682, 2121, 2652, 3332, 4208, 5307, 6656, 8328, 10452], 'n': 7, 'i': 30, 'benefit': 7043659579, 'timing': 'eoy'}, 1160570167], ['immediate short term', {'q': [1485, 1888, 2378, 2991, 3778, 4731, 5935, 7422, 9291, 11653], 'n': 3, 'i': 50, 'benefit': 365125009, 'timing': 'immediate'}, 19033810]], [['five-year term year-end', {'q': [2116, 2656, 3333, 4187, 5233, 6563, 8245, 10342, 12947, 16215], 'n': 5, 'i': 30, 'benefit': 276975028, 'timing': 'eoy'}, 41051826], ['ten-year term immediate', {'q': [1811, 2303, 2910, 3645, 4586, 5762, 7212, 9047, 11354, 14214], 'n': 10, 'i': 60, 'benefit': 378515675, 'timing': 'immediate'}, 127823658], ['term equals table length', {'q': [2118, 2677, 3391, 4262, 5345, 6725, 8419, 10545, 13184, 16505], 'n': 10, 'i': 45, 'benefit': 692594078, 'timing': 'eoy'}, 278847031], ['term longer than table', {'q': [896, 1152, 1459, 1856, 2366, 3001, 3800, 4800, 6029, 7549], 'n': 11, 'i': 60, 'benefit': 734220350, 'timing': 'eoy'}, 'table too short'], ['zero-year term', {'q': [1067, 1347, 1702, 2149, 2735, 3424, 4300, 5419, 6795, 8513], 'n': 0, 'i': 45, 'benefit': 573820538, 'timing': 'eoy'}, 0], ['one-year term', {'q': [1384, 1780, 2238, 2803, 3516, 4419, 5557, 6972, 8758, 10991], 'n': 1, 'i': 30, 'benefit': 1000000014, 'timing': 'eoy'}, 13436893], ['large face amount', {'q': [2149, 2700, 3375, 4238, 5308, 6659, 8372, 10480, 13113, 16421], 'n': 8, 'i': 45, 'benefit': 8475119998, 'timing': 'eoy'}, 2426184535], ['immediate short term', {'q': [1930, 2425, 3075, 3847, 4814, 6063, 7606, 9533, 11922, 14937], 'n': 3, 'i': 50, 'benefit': 708486332, 'timing': 'immediate'}, 47462561]], [['five-year term year-end', {'q': [1799, 2257, 2859, 3588, 4485, 5615, 7030, 8808, 11037, 13815], 'n': 5, 'i': 60, 'benefit': 167620781, 'timing': 'eoy'}, 19505270], ['ten-year term immediate', {'q': [2195, 2744, 3480, 4385, 5523, 6927, 8702, 10910, 13687, 17121], 'n': 10, 'i': 60, 'benefit': 668677245, 'timing': 'immediate'}, 259300273], ['term equals table length', {'q': [1956, 2493, 3138, 3967, 5005, 6257, 7823, 9787, 12266, 15359], 'n': 10, 'i': 45, 'benefit': 282702347, 'timing': 'eoy'}, 107920351], ['term longer than table', {'q': [2134, 2688, 3394, 4247, 5345, 6699, 8380, 10517, 13186, 16496], 'n': 11, 'i': 45, 'benefit': 136081264, 'timing': 'eoy'}, 'table too short'], ['zero-year term', {'q': [1138, 1426, 1819, 2273, 2872, 3634, 4574, 5753, 7197, 9042], 'n': 0, 'i': 30, 'benefit': 668817925, 'timing': 'eoy'}, 0], ['one-year term', {'q': [2207, 2761, 3485, 4400, 5510, 6912, 8685, 10885, 13650, 17091], 'n': 1, 'i': 60, 'benefit': 1000000021, 'timing': 'eoy'}, 20820755], ['large face amount', {'q': [1675, 2113, 2648, 3323, 4166, 5241, 6590, 8244, 10352, 12961], 'n': 8, 'i': 45, 'benefit': 5179542771, 'timing': 'eoy'}, 1207339201], ['immediate short term', {'q': [2261, 2837, 3571, 4509, 5663, 7114, 8900, 11135, 13947, 17461], 'n': 3, 'i': 50, 'benefit': 148092738, 'timing': 'immediate'}, 11530914]], [['five-year term year-end', {'q': [1372, 1750, 2200, 2793, 3528, 4456, 5617, 7060, 8864, 11121], 'n': 5, 'i': 60, 'benefit': 671460915, 'timing': 'eoy'}, 61409725], ['ten-year term immediate', {'q': [1483, 1891, 2391, 3003, 3797, 4757, 5974, 7507, 9411, 11782], 'n': 10, 'i': 45, 'benefit': 110078003, 'timing': 'immediate'}, 34888554], ['term equals table length', {'q': [2202, 2760, 3467, 4334, 5421, 6813, 8558, 10718, 13399, 16772], 'n': 10, 'i': 30, 'benefit': 761103905, 'timing': 'eoy'}, 340778826], ['term longer than table', {'q': [895, 1146, 1437, 1841, 2324, 2934, 3673, 4605, 5775, 7226], 'n': 11, 'i': 60, 'benefit': 612398678, 'timing': 'eoy'}, 'table too short'], ['zero-year term', {'q': [2071, 2616, 3274, 4106, 5164, 6501, 8167, 10248, 12843, 16103], 'n': 0, 'i': 30, 'benefit': 615700164, 'timing': 'eoy'}, 0], ['one-year term', {'q': [1630, 2082, 2630, 3305, 4153, 5203, 6508, 8173, 10245, 12826], 'n': 1, 'i': 60, 'benefit': 1000000028, 'timing': 'eoy'}, 15377359], ['large face amount', {'q': [1055, 1320, 1681, 2105, 2671, 3374, 4252, 5326, 6705, 8431], 'n': 8, 'i': 45, 'benefit': 6631603996, 'timing': 'eoy'}, 1038053345], ['immediate short term', {'q': [1585, 2009, 2540, 3175, 3980, 4989, 6278, 7848, 9822, 12302], 'n': 3, 'i': 50, 'benefit': 128139603, 'timing': 'immediate'}, 7115877]], [['five-year term year-end', {'q': [1585, 2015, 2541, 3196, 4029, 5069, 6349, 7942, 9963, 12472], 'n': 5, 'i': 30, 'benefit': 501144892, 'timing': 'eoy'}, 57536772], ['ten-year term immediate', {'q': [1239, 1548, 1962, 2463, 3080, 3877, 4882, 6122, 7676, 9611], 'n': 10, 'i': 60, 'benefit': 778238927, 'timing': 'immediate'}, 191663547], ['term equals table length', {'q': [1964, 2482, 3120, 3944, 4977, 6261, 7873, 9861, 12344, 15433], 'n': 10, 'i': 60, 'benefit': 912336104, 'timing': 'eoy'}, 318422653], ['term longer than table', {'q': [1113, 1425, 1788, 2240, 2841, 3583, 4528, 5705, 7149, 8939], 'n': 11, 'i': 60, 'benefit': 546287061, 'timing': 'eoy'}, 'table too short'], ['zero-year term', {'q': [1052, 1329, 1686, 2145, 2692, 3399, 4294, 5409, 6806, 8522], 'n': 0, 'i': 45, 'benefit': 558349824, 'timing': 'eoy'}, 0], ['one-year term', {'q': [1695, 2147, 2715, 3434, 4318, 5402, 6762, 8454, 10583, 13270], 'n': 1, 'i': 30, 'benefit': 1000000035, 'timing': 'eoy'}, 16456311], ['large face amount', {'q': [2159, 2724, 3446, 4334, 5433, 6813, 8566, 10749, 13458, 16871], 'n': 8, 'i': 60, 'benefit': 6554802467, 'timing': 'eoy'}, 1774398066], ['immediate short term', {'q': [1616, 2039, 2564, 3251, 4064, 5090, 6396, 8010, 10020, 12534], 'n': 3, 'i': 50, 'benefit': 976296817, 'timing': 'immediate'}, 54960278]]]
for label, args, expected in fixtures[N-1]:
check(label, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| five-year term year-end | 24907301 | 24907301 | Passed |
| ten-year term immediate | 203032132 | 203032132 | Passed |
| term equals table length | 290009324 | 290009324 | Passed |
| term longer than table | table too short | table too short | Passed |
| zero-year term | 0 | 0 | Passed |
| one-year term | 10436893 | 10436893 | Passed |
| large face amount | 1160570167 | 1160570167 | Passed |
| immediate short term | 19033810 | 19033810 | Passed |
SHA-256 / 10a051e4757c69fe439867d486dfd5f5cc8102523238375bfa1dfca20ea8e826
Verification & scope
A deterministic bounded teaching model of a stipulated toy actuarial contract. Rates are small synthetic tables, exact rationals are used where practical and floats are rounded at the output; it makes no claim of conformance with any published table, standard of practice or regulation. This reproducer isolates one failure mechanism. Results cover the supplied fixtures. Variants within a family share a test contract and should remain grouped when constructing evaluation splits. Related mechanisms with a shared evaluation_group must also remain together; these controlled models are not independent production incidents.
Observations recorded using Python 3.12.14 at 2026-09-29T14:47:14.859922+00:00.
Case digest / a723122670382f99905251d9d370488a015f7175b179fd0629baaff03b0e3b0f