Case 964
The roast eight times the size took four times the time
the_roast_eight_times_the_size_took_four_times_the_time.eml - A cook who knows a one-kilogram joint takes thirty minutes scales the recipe to an eight- kilogram joint of the same shape, multiplies the time by eight, and takes it out dry and grey two hours after it was done. How cooking time grows with the size of the joint is computed below.
ok: true — round-trip fixpoint reached (python1 == python2)updated 2026-09-22
EML
eml# Self-authored for the EML case corpus (no external origin). A cook who knows
# a one-kilogram joint takes thirty minutes scales the recipe to an eight-
# kilogram joint of the same shape, multiplies the time by eight, and takes it
# out dry and grey two hours after it was done. How cooking time grows with
# the size of the joint is computed below.
#
# The reasoning is careful. The small joint's time is right; eight kilograms is
# eight times the meat; the shape is the same; the oven is the same; and the
# intent was exactly 'the same doneness at the centre'.
#
# Heat has to travel from the surface to the centre, and that journey takes
# time in proportion to the square of the distance - eight times the mass at
# the same shape is only twice the thickness, so the centre is reached in four
# times the time, not eight, and the extra two hours cooked a joint that was
# already done.
1 => small_joint_kg
30 => small_joint_minutes
8 => large_joint_kg
int(large_joint_kg / small_joint_kg) => mass_ratio
2 => thickness_ratio_for_eight_times_the_mass
thickness_ratio_for_eight_times_the_mass^3 => check_thickness_ratio_cubed
thickness_ratio_for_eight_times_the_mass^2 => time_ratio_from_the_square_of_the_thickness
small_joint_minutes * time_ratio_from_the_square_of_the_thickness => large_joint_minutes_actually_needed
small_joint_minutes * mass_ratio => large_joint_minutes_the_cook_gave_it
large_joint_minutes_the_cook_gave_it - large_joint_minutes_actually_needed => minutes_past_done
int(minutes_past_done * 100 / large_joint_minutes_actually_needed) => overcooked_by_percent_of_the_needed_time
"small joint : " + str(small_joint_kg) + " kg, " + str(small_joint_minutes) + " minutes" ^0
"large joint : " + str(large_joint_kg) + " kg, the same shape, " + str(mass_ratio) + " times the mass" ^0
"thickness : " + str(thickness_ratio_for_eight_times_the_mass) + " times (since " + str(thickness_ratio_for_eight_times_the_mass) + " cubed is " + str(check_thickness_ratio_cubed) + ")" ^0
"time to the centre : grows with thickness squared, " + str(time_ratio_from_the_square_of_the_thickness) + " times" ^0
"large joint actually needs : " + str(large_joint_minutes_actually_needed) + " minutes" ^0
"the cook gave it : " + str(large_joint_minutes_the_cook_gave_it) + " minutes, " + str(mass_ratio) + " times the small joint's" ^0
"past done by : " + str(minutes_past_done) + " minutes, " + str(overcooked_by_percent_of_the_needed_time) + " percent of the needed time" ^0
"" ^0
# ---- what the cook verified ----
"the eight-times reasoning" ^0
" small joint : " + str(small_joint_minutes) + " minutes, right" ^0
" mass : " + str(mass_ratio) + " times" ^0
" shape and oven : the same" ^0
" intent : the same doneness at the centre" ^0
" facts wrong : 0" ^0
" verdict : EIGHT TIMES THE MEAT, EIGHT TIMES THE TIME" ^0
"" ^0
" keeping the shape and the oven the same is the part done" ^0
" right here, and it is why the only thing that changed is" ^0
" how far the heat has to travel" ^0
"" ^0
# ---- how cooking time grows ----
"heat travels through thickness" ^0
" what doneness is : the centre reaching a temperature" ^0
" what sets the time : how far the centre is from the surface," ^0
" and heat's journey time grows with the square of that" ^0
" " + str(mass_ratio) + " times the mass at the same shape : " + str(thickness_ratio_for_eight_times_the_mass) + " times every length" ^0
" " + str(thickness_ratio_for_eight_times_the_mass) + " times the thickness : " + str(time_ratio_from_the_square_of_the_thickness) + " times the time, " + str(large_joint_minutes_actually_needed) + " minutes" ^0
" what mass measured : how much meat there is, not how far" ^0
" the middle of it is from the heat" ^0
"" ^0
# ---- what the cook got ----
"the joint" ^0
" believed : done at " + str(large_joint_minutes_the_cook_gave_it) + " minutes" ^0
" actual : done at " + str(large_joint_minutes_actually_needed) + " minutes and cooked on for " + str(minutes_past_done) + " more" ^0
" is the small joint's time wrong : no" ^0
" does time scale with mass : no; with the square of the" ^0
" thickness, and mass is the cube of it" ^0
"" ^0
# ---- null control ----
# The same scaling done through the thickness instead of through the mass.
240 => nc_minutes_scaling_by_mass
120 => nc_minutes_scaling_by_thickness_squared
120 => nc_minutes_the_right_scaling_removes
"null control - scale by the thickness, squared" ^0
" minutes, scaling by mass : " + str(nc_minutes_scaling_by_mass) ^0
" minutes, scaling by thickness squared : " + str(nc_minutes_scaling_by_thickness_squared) ^0
" minutes the right scaling removes : " + str(nc_minutes_the_right_scaling_removes) ^0
" no joint and no oven changed; the quantity that heat" ^0
" actually crosses was the one scaled" ^0
"" ^0
# ---- the rule ----
"what a correct time for the small joint guarantees" ^0
" the small joint is done at " + str(small_joint_minutes) + " minutes : exactly" ^0
" eight times the meat needs eight times the time : not addressed;" ^0
" heat crosses thickness, eight times the mass is twice the" ^0
" thickness, and twice the thickness is " + str(time_ratio_from_the_square_of_the_thickness) + " times the time," ^0
" " + str(large_joint_minutes_actually_needed) + " minutes, not " + str(large_joint_minutes_the_cook_gave_it) ^0
"" ^0
"the oven does not weigh the joint; it measures the distance to the middle," ^0
"and mass grows three times as fast as that distance while cooking time grows" ^0
"twice as fast, so the big joint is always readier than its weight suggests" ^0
"" ^0
"The small joint's " + str(small_joint_minutes) + " minutes is right. But heat travels through thickness, and" ^0
"" + str(mass_ratio) + " times the mass at the same shape is " + str(thickness_ratio_for_eight_times_the_mass) + " times the thickness, so the centre is done" ^0
"in " + str(time_ratio_from_the_square_of_the_thickness) + " times the time, " + str(large_joint_minutes_actually_needed) + " minutes, and the " + str(large_joint_minutes_the_cook_gave_it) + " the cook allowed cooked it " + str(minutes_past_done) + " minutes" ^0
"past done, until time is scaled by the distance heat crosses and not by the weight." ^0Python (deterministic transpilation)
pythonsmall_joint_kg = 1
small_joint_minutes = 30
large_joint_kg = 8
mass_ratio = int(large_joint_kg / small_joint_kg)
thickness_ratio_for_eight_times_the_mass = 2
check_thickness_ratio_cubed = thickness_ratio_for_eight_times_the_mass**3
time_ratio_from_the_square_of_the_thickness = thickness_ratio_for_eight_times_the_mass**2
large_joint_minutes_actually_needed = small_joint_minutes * time_ratio_from_the_square_of_the_thickness
large_joint_minutes_the_cook_gave_it = small_joint_minutes * mass_ratio
minutes_past_done = large_joint_minutes_the_cook_gave_it - large_joint_minutes_actually_needed
overcooked_by_percent_of_the_needed_time = int(minutes_past_done * 100 / large_joint_minutes_actually_needed)
print("small joint : " + str(small_joint_kg) + " kg, " + str(small_joint_minutes) + " minutes")
print("large joint : " + str(large_joint_kg) + " kg, the same shape, " + str(mass_ratio) + " times the mass")
print("thickness : " + str(thickness_ratio_for_eight_times_the_mass) + " times (since " + str(thickness_ratio_for_eight_times_the_mass) + " cubed is " + str(check_thickness_ratio_cubed) + ")")
print("time to the centre : grows with thickness squared, " + str(time_ratio_from_the_square_of_the_thickness) + " times")
print("large joint actually needs : " + str(large_joint_minutes_actually_needed) + " minutes")
print("the cook gave it : " + str(large_joint_minutes_the_cook_gave_it) + " minutes, " + str(mass_ratio) + " times the small joint's")
print("past done by : " + str(minutes_past_done) + " minutes, " + str(overcooked_by_percent_of_the_needed_time) + " percent of the needed time")
print("")
print("the eight-times reasoning")
print(" small joint : " + str(small_joint_minutes) + " minutes, right")
print(" mass : " + str(mass_ratio) + " times")
print(" shape and oven : the same")
print(" intent : the same doneness at the centre")
print(" facts wrong : 0")
print(" verdict : EIGHT TIMES THE MEAT, EIGHT TIMES THE TIME")
print("")
print(" keeping the shape and the oven the same is the part done")
print(" right here, and it is why the only thing that changed is")
print(" how far the heat has to travel")
print("")
print("heat travels through thickness")
print(" what doneness is : the centre reaching a temperature")
print(" what sets the time : how far the centre is from the surface,")
print(" and heat's journey time grows with the square of that")
print(" " + str(mass_ratio) + " times the mass at the same shape : " + str(thickness_ratio_for_eight_times_the_mass) + " times every length")
print(" " + str(thickness_ratio_for_eight_times_the_mass) + " times the thickness : " + str(time_ratio_from_the_square_of_the_thickness) + " times the time, " + str(large_joint_minutes_actually_needed) + " minutes")
print(" what mass measured : how much meat there is, not how far")
print(" the middle of it is from the heat")
print("")
print("the joint")
print(" believed : done at " + str(large_joint_minutes_the_cook_gave_it) + " minutes")
print(" actual : done at " + str(large_joint_minutes_actually_needed) + " minutes and cooked on for " + str(minutes_past_done) + " more")
print(" is the small joint's time wrong : no")
print(" does time scale with mass : no; with the square of the")
print(" thickness, and mass is the cube of it")
print("")
nc_minutes_scaling_by_mass = 240
nc_minutes_scaling_by_thickness_squared = 120
nc_minutes_the_right_scaling_removes = 120
print("null control - scale by the thickness, squared")
print(" minutes, scaling by mass : " + str(nc_minutes_scaling_by_mass))
print(" minutes, scaling by thickness squared : " + str(nc_minutes_scaling_by_thickness_squared))
print(" minutes the right scaling removes : " + str(nc_minutes_the_right_scaling_removes))
print(" no joint and no oven changed; the quantity that heat")
print(" actually crosses was the one scaled")
print("")
print("what a correct time for the small joint guarantees")
print(" the small joint is done at " + str(small_joint_minutes) + " minutes : exactly")
print(" eight times the meat needs eight times the time : not addressed;")
print(" heat crosses thickness, eight times the mass is twice the")
print(" thickness, and twice the thickness is " + str(time_ratio_from_the_square_of_the_thickness) + " times the time,")
print(" " + str(large_joint_minutes_actually_needed) + " minutes, not " + str(large_joint_minutes_the_cook_gave_it))
print("")
print("the oven does not weigh the joint; it measures the distance to the middle,")
print("and mass grows three times as fast as that distance while cooking time grows")
print("twice as fast, so the big joint is always readier than its weight suggests")
print("")
print("The small joint's " + str(small_joint_minutes) + " minutes is right. But heat travels through thickness, and")
print("" + str(mass_ratio) + " times the mass at the same shape is " + str(thickness_ratio_for_eight_times_the_mass) + " times the thickness, so the centre is done")
print("in " + str(time_ratio_from_the_square_of_the_thickness) + " times the time, " + str(large_joint_minutes_actually_needed) + " minutes, and the " + str(large_joint_minutes_the_cook_gave_it) + " the cook allowed cooked it " + str(minutes_past_done) + " minutes")
print("past done, until time is scaled by the distance heat crosses and not by the weight.")stdout (executed)
textsmall joint : 1 kg, 30 minutes
large joint : 8 kg, the same shape, 8 times the mass
thickness : 2 times (since 2 cubed is 8)
time to the centre : grows with thickness squared, 4 times
large joint actually needs : 120 minutes
the cook gave it : 240 minutes, 8 times the small joint's
past done by : 120 minutes, 100 percent of the needed time
the eight-times reasoning
small joint : 30 minutes, right
mass : 8 times
shape and oven : the same
intent : the same doneness at the centre
facts wrong : 0
verdict : EIGHT TIMES THE MEAT, EIGHT TIMES THE TIME
keeping the shape and the oven the same is the part done
right here, and it is why the only thing that changed is
how far the heat has to travel
heat travels through thickness
what doneness is : the centre reaching a temperature
what sets the time : how far the centre is from the surface,
and heat's journey time grows with the square of that
8 times the mass at the same shape : 2 times every length
2 times the thickness : 4 times the time, 120 minutes
what mass measured : how much meat there is, not how far
the middle of it is from the heat
the joint
believed : done at 240 minutes
actual : done at 120 minutes and cooked on for 120 more
is the small joint's time wrong : no
does time scale with mass : no; with the square of the
thickness, and mass is the cube of it
null control - scale by the thickness, squared
minutes, scaling by mass : 240
minutes, scaling by thickness squared : 120
minutes the right scaling removes : 120
no joint and no oven changed; the quantity that heat
actually crosses was the one scaled
what a correct time for the small joint guarantees
the small joint is done at 30 minutes : exactly
eight times the meat needs eight times the time : not addressed;
heat crosses thickness, eight times the mass is twice the
thickness, and twice the thickness is 4 times the time,
120 minutes, not 240
the oven does not weigh the joint; it measures the distance to the middle,
and mass grows three times as fast as that distance while cooking time grows
twice as fast, so the big joint is always readier than its weight suggests
The small joint's 30 minutes is right. But heat travels through thickness, and
8 times the mass at the same shape is 2 times the thickness, so the centre is done
in 4 times the time, 120 minutes, and the 240 the cook allowed cooked it 120 minutes
past done, until time is scaled by the distance heat crosses and not by the weight.Trace event types
eml:run:starteml:assigneml:outputeml:run:done