Case 945
The back row was two stops dark
the_back_row_was_two_stops_dark.eml - A group photo is lit by one flash on the camera, the front row two metres away and the back row four, the flash is set exactly for the front row, and the photographer reasons that the back row is only two metres further so it will be a little darker. How much darker two more metres make it is computed below.
ok: true — round-trip fixpoint reached (python1 == python2)updated 2026-09-21
EML
eml# Self-authored for the EML case corpus (no external origin). A group photo is
# lit by one flash on the camera, the front row two metres away and the back
# row four, the flash is set exactly for the front row, and the photographer
# reasons that the back row is only two metres further so it will be a little
# darker. How much darker two more metres make it is computed below.
#
# The reasoning is careful. The distances are right; the flash exposure for the
# front row is exact; two metres is genuinely a small distance; and the intent
# is exactly 'everyone lit'.
#
# Light from a small source falls with the square of the distance, so twice the
# distance is a quarter of the light - the back row is two stops dark, not a
# little - and moving the flash back so the rows are at eight and ten metres
# brings the ratio under a stop, while doubling the flash power changes nothing
# between the rows because it doubles both.
2 => front_row_distance_m
4 => back_row_distance_m
8 => front_row_distance_with_the_flash_moved_back_m
10 => back_row_distance_with_the_flash_moved_back_m
2 => light_ratio_that_is_one_stop
front_row_distance_m^2 => front_row_distance_squared
back_row_distance_m^2 => back_row_distance_squared
int(back_row_distance_squared * 10000 / front_row_distance_squared) => front_to_back_light_ratio_per_myriad
int(front_to_back_light_ratio_per_myriad / 10000) => back_row_darker_by_a_factor_of
int(10000 * 10000 / front_to_back_light_ratio_per_myriad) => back_row_light_as_a_share_of_the_front_per_myriad
back_row_distance_m - front_row_distance_m => extra_metres_to_the_back_row
front_row_distance_with_the_flash_moved_back_m^2 => moved_front_distance_squared
back_row_distance_with_the_flash_moved_back_m^2 => moved_back_distance_squared
int(moved_back_distance_squared * 10000 / moved_front_distance_squared) => moved_front_to_back_light_ratio_per_myriad
light_ratio_that_is_one_stop * 10000 - moved_front_to_back_light_ratio_per_myriad => margin_under_one_stop_per_myriad
back_row_distance_with_the_flash_moved_back_m - front_row_distance_with_the_flash_moved_back_m => extra_metres_to_the_back_row_after_moving
"flash on the camera : front row at " + str(front_row_distance_m) + " m, back row at " + str(back_row_distance_m) + " m" ^0
"extra distance to the back row : " + str(extra_metres_to_the_back_row) + " m" ^0
"light, front to back : " + str(front_to_back_light_ratio_per_myriad) + " per ten thousand, a factor of " + str(back_row_darker_by_a_factor_of) ^0
"back row receives : " + str(back_row_light_as_a_share_of_the_front_per_myriad) + " per ten thousand of the front row's light, two stops dark" ^0
"" ^0
"flash moved back : front row at " + str(front_row_distance_with_the_flash_moved_back_m) + " m, back row at " + str(back_row_distance_with_the_flash_moved_back_m) + " m" ^0
"extra distance, still : " + str(extra_metres_to_the_back_row_after_moving) + " m" ^0
"light, front to back : " + str(moved_front_to_back_light_ratio_per_myriad) + " per ten thousand, under one stop by " + str(margin_under_one_stop_per_myriad) ^0
"" ^0
# ---- what the photographer verified ----
"the two-metres-further reasoning" ^0
" distances : " + str(front_row_distance_m) + " and " + str(back_row_distance_m) + " m, measured" ^0
" flash : exact for the front row" ^0
" arithmetic : the back row is " + str(extra_metres_to_the_back_row) + " m further, a small distance" ^0
" intent : everyone lit" ^0
" facts wrong : 0" ^0
" verdict : TWO METRES FURTHER IS A LITTLE DARKER" ^0
"" ^0
" setting the flash exactly for the front row is the part" ^0
" done right here, and it is why the front row is perfectly" ^0
" exposed in every frame" ^0
"" ^0
# ---- how much darker two more metres make it ----
"the inverse square" ^0
" what spreads the light : distance, in two directions at once," ^0
" so the same flash covers four times the area at twice the range" ^0
" " + str(front_row_distance_m) + " to " + str(back_row_distance_m) + " m : the distance doubled, the light quartered," ^0
" " + str(back_row_darker_by_a_factor_of) + " times less, two stops" ^0
" what matters : the ratio of the distances, not the metres between" ^0
" " + str(front_row_distance_with_the_flash_moved_back_m) + " to " + str(back_row_distance_with_the_flash_moved_back_m) + " m : the same " + str(extra_metres_to_the_back_row_after_moving) + " m between the rows, a ratio of" ^0
" " + str(moved_front_to_back_light_ratio_per_myriad) + " per ten thousand, under a stop" ^0
" what more flash power does : doubles both rows, and the" ^0
" ratio between them does not move" ^0
"" ^0
# ---- what the photographer got ----
"the print" ^0
" believed : the back row a little darker" ^0
" actual : the back row at " + str(back_row_light_as_a_share_of_the_front_per_myriad) + " per ten thousand of the front, two stops down" ^0
" is any distance wrong : no" ^0
" is two metres a small distance : not from a flash two metres" ^0
" away; it is a doubling, and the light falls with the square" ^0
"" ^0
# ---- null control ----
# The same group lit with the flash moved back so the rows are at eight and ten
# metres instead of two and four.
40000 => nc_front_to_back_ratio_flash_on_the_camera_per_myriad
15625 => nc_front_to_back_ratio_flash_moved_back_per_myriad
24375 => nc_ratio_the_move_removes_per_myriad
"null control - move the flash back" ^0
" front to back, flash on the camera : " + str(nc_front_to_back_ratio_flash_on_the_camera_per_myriad) + " per ten thousand" ^0
" front to back, flash moved back : " + str(nc_front_to_back_ratio_flash_moved_back_per_myriad) + " per ten thousand" ^0
" ratio the move removes : " + str(nc_ratio_the_move_removes_per_myriad) + " per ten thousand" ^0
" no row moved and no power changed; the two distances were" ^0
" made nearly equal as a ratio" ^0
"" ^0
# ---- the rule ----
"what an exact flash exposure for the front row guarantees" ^0
" the front row is correctly lit : exactly" ^0
" the back row is nearly as lit : not addressed; at twice the" ^0
" distance it receives " + str(back_row_light_as_a_share_of_the_front_per_myriad) + " per ten thousand of the light, two stops" ^0
" dark, and only a smaller ratio of distances - not more" ^0
" power - closes the gap" ^0
"" ^0
"a flash does not know metres; it knows ratios, and two metres is nothing at" ^0
"eight and everything at two, because light thins with the square of how far" ^0
"it has already come" ^0
"" ^0
"The flash is exact for the front row - that holds. But " + str(back_row_distance_m) + " m is twice " + str(front_row_distance_m) + " m, and light" ^0
"falls with the square, so the back row gets " + str(back_row_light_as_a_share_of_the_front_per_myriad) + " per ten thousand of the front's, two" ^0
"stops dark, while at " + str(front_row_distance_with_the_flash_moved_back_m) + " and " + str(back_row_distance_with_the_flash_moved_back_m) + " m the same two metres is a ratio of " + str(moved_front_to_back_light_ratio_per_myriad) + ", under a" ^0
"stop, until the flash is placed by the ratio of the distances and not the metres between." ^0Python (deterministic transpilation)
pythonfront_row_distance_m = 2
back_row_distance_m = 4
front_row_distance_with_the_flash_moved_back_m = 8
back_row_distance_with_the_flash_moved_back_m = 10
light_ratio_that_is_one_stop = 2
front_row_distance_squared = front_row_distance_m**2
back_row_distance_squared = back_row_distance_m**2
front_to_back_light_ratio_per_myriad = int(back_row_distance_squared * 10000 / front_row_distance_squared)
back_row_darker_by_a_factor_of = int(front_to_back_light_ratio_per_myriad / 10000)
back_row_light_as_a_share_of_the_front_per_myriad = int(10000 * 10000 / front_to_back_light_ratio_per_myriad)
extra_metres_to_the_back_row = back_row_distance_m - front_row_distance_m
moved_front_distance_squared = front_row_distance_with_the_flash_moved_back_m**2
moved_back_distance_squared = back_row_distance_with_the_flash_moved_back_m**2
moved_front_to_back_light_ratio_per_myriad = int(moved_back_distance_squared * 10000 / moved_front_distance_squared)
margin_under_one_stop_per_myriad = light_ratio_that_is_one_stop * 10000 - moved_front_to_back_light_ratio_per_myriad
extra_metres_to_the_back_row_after_moving = back_row_distance_with_the_flash_moved_back_m - front_row_distance_with_the_flash_moved_back_m
print("flash on the camera : front row at " + str(front_row_distance_m) + " m, back row at " + str(back_row_distance_m) + " m")
print("extra distance to the back row : " + str(extra_metres_to_the_back_row) + " m")
print("light, front to back : " + str(front_to_back_light_ratio_per_myriad) + " per ten thousand, a factor of " + str(back_row_darker_by_a_factor_of))
print("back row receives : " + str(back_row_light_as_a_share_of_the_front_per_myriad) + " per ten thousand of the front row's light, two stops dark")
print("")
print("flash moved back : front row at " + str(front_row_distance_with_the_flash_moved_back_m) + " m, back row at " + str(back_row_distance_with_the_flash_moved_back_m) + " m")
print("extra distance, still : " + str(extra_metres_to_the_back_row_after_moving) + " m")
print("light, front to back : " + str(moved_front_to_back_light_ratio_per_myriad) + " per ten thousand, under one stop by " + str(margin_under_one_stop_per_myriad))
print("")
print("the two-metres-further reasoning")
print(" distances : " + str(front_row_distance_m) + " and " + str(back_row_distance_m) + " m, measured")
print(" flash : exact for the front row")
print(" arithmetic : the back row is " + str(extra_metres_to_the_back_row) + " m further, a small distance")
print(" intent : everyone lit")
print(" facts wrong : 0")
print(" verdict : TWO METRES FURTHER IS A LITTLE DARKER")
print("")
print(" setting the flash exactly for the front row is the part")
print(" done right here, and it is why the front row is perfectly")
print(" exposed in every frame")
print("")
print("the inverse square")
print(" what spreads the light : distance, in two directions at once,")
print(" so the same flash covers four times the area at twice the range")
print(" " + str(front_row_distance_m) + " to " + str(back_row_distance_m) + " m : the distance doubled, the light quartered,")
print(" " + str(back_row_darker_by_a_factor_of) + " times less, two stops")
print(" what matters : the ratio of the distances, not the metres between")
print(" " + str(front_row_distance_with_the_flash_moved_back_m) + " to " + str(back_row_distance_with_the_flash_moved_back_m) + " m : the same " + str(extra_metres_to_the_back_row_after_moving) + " m between the rows, a ratio of")
print(" " + str(moved_front_to_back_light_ratio_per_myriad) + " per ten thousand, under a stop")
print(" what more flash power does : doubles both rows, and the")
print(" ratio between them does not move")
print("")
print("the print")
print(" believed : the back row a little darker")
print(" actual : the back row at " + str(back_row_light_as_a_share_of_the_front_per_myriad) + " per ten thousand of the front, two stops down")
print(" is any distance wrong : no")
print(" is two metres a small distance : not from a flash two metres")
print(" away; it is a doubling, and the light falls with the square")
print("")
nc_front_to_back_ratio_flash_on_the_camera_per_myriad = 40000
nc_front_to_back_ratio_flash_moved_back_per_myriad = 15625
nc_ratio_the_move_removes_per_myriad = 24375
print("null control - move the flash back")
print(" front to back, flash on the camera : " + str(nc_front_to_back_ratio_flash_on_the_camera_per_myriad) + " per ten thousand")
print(" front to back, flash moved back : " + str(nc_front_to_back_ratio_flash_moved_back_per_myriad) + " per ten thousand")
print(" ratio the move removes : " + str(nc_ratio_the_move_removes_per_myriad) + " per ten thousand")
print(" no row moved and no power changed; the two distances were")
print(" made nearly equal as a ratio")
print("")
print("what an exact flash exposure for the front row guarantees")
print(" the front row is correctly lit : exactly")
print(" the back row is nearly as lit : not addressed; at twice the")
print(" distance it receives " + str(back_row_light_as_a_share_of_the_front_per_myriad) + " per ten thousand of the light, two stops")
print(" dark, and only a smaller ratio of distances - not more")
print(" power - closes the gap")
print("")
print("a flash does not know metres; it knows ratios, and two metres is nothing at")
print("eight and everything at two, because light thins with the square of how far")
print("it has already come")
print("")
print("The flash is exact for the front row - that holds. But " + str(back_row_distance_m) + " m is twice " + str(front_row_distance_m) + " m, and light")
print("falls with the square, so the back row gets " + str(back_row_light_as_a_share_of_the_front_per_myriad) + " per ten thousand of the front's, two")
print("stops dark, while at " + str(front_row_distance_with_the_flash_moved_back_m) + " and " + str(back_row_distance_with_the_flash_moved_back_m) + " m the same two metres is a ratio of " + str(moved_front_to_back_light_ratio_per_myriad) + ", under a")
print("stop, until the flash is placed by the ratio of the distances and not the metres between.")stdout (executed)
textflash on the camera : front row at 2 m, back row at 4 m
extra distance to the back row : 2 m
light, front to back : 40000 per ten thousand, a factor of 4
back row receives : 2500 per ten thousand of the front row's light, two stops dark
flash moved back : front row at 8 m, back row at 10 m
extra distance, still : 2 m
light, front to back : 15625 per ten thousand, under one stop by 4375
the two-metres-further reasoning
distances : 2 and 4 m, measured
flash : exact for the front row
arithmetic : the back row is 2 m further, a small distance
intent : everyone lit
facts wrong : 0
verdict : TWO METRES FURTHER IS A LITTLE DARKER
setting the flash exactly for the front row is the part
done right here, and it is why the front row is perfectly
exposed in every frame
the inverse square
what spreads the light : distance, in two directions at once,
so the same flash covers four times the area at twice the range
2 to 4 m : the distance doubled, the light quartered,
4 times less, two stops
what matters : the ratio of the distances, not the metres between
8 to 10 m : the same 2 m between the rows, a ratio of
15625 per ten thousand, under a stop
what more flash power does : doubles both rows, and the
ratio between them does not move
the print
believed : the back row a little darker
actual : the back row at 2500 per ten thousand of the front, two stops down
is any distance wrong : no
is two metres a small distance : not from a flash two metres
away; it is a doubling, and the light falls with the square
null control - move the flash back
front to back, flash on the camera : 40000 per ten thousand
front to back, flash moved back : 15625 per ten thousand
ratio the move removes : 24375 per ten thousand
no row moved and no power changed; the two distances were
made nearly equal as a ratio
what an exact flash exposure for the front row guarantees
the front row is correctly lit : exactly
the back row is nearly as lit : not addressed; at twice the
distance it receives 2500 per ten thousand of the light, two stops
dark, and only a smaller ratio of distances - not more
power - closes the gap
a flash does not know metres; it knows ratios, and two metres is nothing at
eight and everything at two, because light thins with the square of how far
it has already come
The flash is exact for the front row - that holds. But 4 m is twice 2 m, and light
falls with the square, so the back row gets 2500 per ten thousand of the front's, two
stops dark, while at 8 and 10 m the same two metres is a ratio of 15625, under a
stop, until the flash is placed by the ratio of the distances and not the metres between.Trace event types
eml:run:starteml:assigneml:outputeml:run:done