<!-- canonical: efficientnewlanguage.org/ai/examples/945-the-back-row-was-two-stops-dark | ai_layer_version: 0.1.0 | updated: 2026-09-21 -->

# Example 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.

## 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." ^0
```

## Python (deterministic transpilation)

```python
front_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)

```text
flash 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.
```

## Round-trip

`ok: true` — round-trip fixpoint reached (python1 == python2)

## Trace event types

eml:run:start · eml:assign · eml:output · eml:run:done
