Het logigram codeert de klemmen als predicaten, draait de variabelenruimte uit en levert de vensters, de doodsmatrix en de kosten voor run A, run B-streng en run B-consistent. Hieronder verbatim. De publicatie (https://doi.org/10.5281/zenodo.22944959) draagt hetzelfde logigram — dezelfde predicaten, dezelfde constanten, dezelfde drie runs — met voluit geschreven Engelse namen en het uitvoerpad uit de omgevingsvariabele `LOGIGRAM_OUT`; wie het draait, krijgt de cijfers van bijlage A.1 en bijlage C.
```python # -- coding: utf-8 -- """Het logigram. Machinaal berekend. Codeert de klemmenlijst v2 als predicaten, draait de variabelenruimte uit, levert de doodsmatrix en de kostenfunctie, voor run A (vrijstaand) en run B (gekoppeld).
Verankerd aan de eigen cijfers van het dossier: - de drie ketens en hun L/T/P/V/U-profiel uit het grootboek; - de eclipsscan (Espenak): zichtbare umbrale eclipsen alleen in 5,4,1 v.Chr.; - de terugteltabel (leeftijd bij doop AD 27), waartegen gevalideerd wordt.
BC-jaren als positieve gehele getallen (5 = 5 v.Chr.); groter = vroeger. 'vóór': a vóór b <=> a_bc > b_bc. Geen jaar 0: leeftijd = doop_AD + geboorte_bc - 1. """ import itertools, json, collections
# ---------------------------------------------------------------- eclips (Espenak) # umbrale eclipsen waarvan de umbra vanuit Jeruzalem/Jericho zichtbaar was, in het venster, # als (jaar v.Chr., maand, dag); 1 v.Chr. heeft er twee (10 januari totaal, 29 december partieel bij maansopkomst) ECLIPSEN_ZICHTBAAR = [(5,3,23), (5,9,15), (4,3,13), (1,1,10), (1,12,29)] # 7,6,3,2 v.Chr.: geen zichtbare umbrale eclips
# ---------------------------------------------------------------- de klemmen als predicaten # Elke klem geeft, per cel, een van: 'ok' (leest/telt legitiem), of een kost-letter, # of 'DOOD' (harde uitsluiting -> doodsmatrix).
def klem_eclips(sterfjaar): """V-1: een zichtbare umbrale eclips moet aan de dood voorafgaan: in het sterfjaar, of in de december vóór een dood vroeg in het volgende jaar. Op de eclipsdatum, niet op het kalenderjaar.""" for (j, m, d) in ECLIPSEN_ZICHTBAAR: if j == sterfjaar or (j == sterfjaar + 1 and m == 12): return 'ok' return 'DOOD'
def klem_matteus2_hard(gebjaar, gebseiz, sterfjaar, sterfseiz): "G-1 hard deel: geboorte vóór Herodes' dood. Interpretatief in de ondergrens, hard in 'niet erna'." if gebjaar > sterfjaar: return 'ok' # duidelijk vóór if gebjaar == sterfjaar: # zelfde jaar: seizoen beslist return 'ok' if SEIZOEN_ORDE[gebseiz] < SEIZOEN_ORDE[sterfseiz] else 'DOOD' return 'DOOD' # gebjaar < sterfjaar = geboren ná de dood
def klem_matteus2_vroege_rand(gebjaar, sterfjaar): """G-1 vroege rand (hoe vroeg mag de geboorte zijn). Mattheüs 2:16 "twee jaar en jonger". afstand = jaren vóór de dood. Herodes' cutoff ~2 jaar, ROYAAL genomen (HV 16 sep: Herodes rekent ruim om zeker te zijn dat de messias gedood wordt, en kan de mogelijkheid dat de ster de verwekking merkte in zijn marge hebben verdisconteerd). <=2: binnen de cutoff. 3: 1 jaar marge (de dossier-rand, 7 v.Chr. bij dood 4). 4: 2 jaar marge (duur, postulaat). >=5: leeftijd 5+, botst plat met "twee jaar en jonger" -> DOOD. De late rand (dicht op de dood) is juist ZACHT: door Herodes' royale marge kan het kind jonger zijn dan de cutoff, dus de geboorte mag vlak vóór de dood liggen.""" afstand = gebjaar - sterfjaar if afstand < 0: return 'ok' # geboren ná: door de harde klem al gevangen if afstand <= 2: return 'ok' if afstand == 3: return 'zacht' if afstand == 4: return 'P' return 'DOOD' # >=5 jaar vóór de dood
DOOP_VLOER = 27 # Tiberius' 15e jaar, inclusief geteld = de vroegst mogelijke doop (HV 16 sep) DOOP_OPTIES = [27,28,29] # Hoehner: het 15e jaar valt, naar telwijze, tussen AD 27 en 29
def klem_tiberius(doop_AD): "B-1a samengesteld: de doop kan niet vóór Tiberius' 15e jaar. 27 n.Chr. is de ondergrens (inclusief)." return 'ok' if doop_AD >= DOOP_VLOER else 'DOOD'
def klem_lukas323(gebjaar, doop_AD=27, streng=True): """G-3 (run B): Hoehner. Leeftijd = doop_AD + gebjaar - 1 (geen jaar 0). Lukas 3:23 "ongeveer dertig": ὡσεί markeert een rond getal met bescheiden speling; ±2 (Plummer, ICC op Lukas 3:23) -> leeftijd 28..32. (Hoehners ±3, 27..33, is te ruim: dan kan de toets niet falen.) Hoehners eigen vloer: geboorte 'no earlier than 5 B.C.' -> NIET vroeger dan 5 v.Chr. -> gebjaar <= 5.""" leeftijd = doop_AD + gebjaar - 1 binnen_leeftijd = 28 <= leeftijd <= 32 if streng: return 'ok' if (binnen_leeftijd and gebjaar <= 5) else 'DOOD' return 'ok' if binnen_leeftijd else 'DOOD'
# ---------------------------------------------------------------- de sweep def sweep(run, streng=True): """run 'A' (vrijstaand) of 'B' (gekoppeld, + doop 27 + Lukas 3:23/Hoehner). streng=True -> G-3 met Hoehners geïmporteerde vloer gebjaar<=5 (doop-AD-29-specifiek); streng=False -> G-3 met alleen de Lukas-3:23-leeftijdsband 28..32, per doopjaar consistent (op HV's eigen doop AD 27 geeft leeftijd 32 juist 6 v.Chr., niet 5).""" levend=[]; dood=[] doopset = DOOP_OPTIES if run=='B' else [None] for keten,kv in KETENS.items(): sterfjaar=kv['sterfjaar'] for sterfseiz in kv['seizoenen']: for gebjaar in GEBJAAR: for gebseiz in GEBSEIZOEN: for doop in doopset: doodsoorzaken=[]; kosten=[] # harde klemmen if klem_eclips(sterfjaar)=='DOOD': doodsoorzaken.append('V-1 eclips (geen zichtbare umbrale eclips vóór de dood)') mh=klem_matteus2_hard(gebjaar,gebseiz,sterfjaar,sterfseiz) if mh=='DOOD': doodsoorzaken.append('G-1 Mattheüs 2 (geboren ná de dood)') mv=klem_matteus2_vroege_rand(gebjaar,sterfjaar) if mv=='DOOD': doodsoorzaken.append('G-1 Mattheüs 2 (>=5 jaar vóór de dood; leeftijd botst met "twee jaar en jonger")') if run=='B': if klem_tiberius(doop)=='DOOD': doodsoorzaken.append('B-1a Tiberius 15e jaar (doop vóór de vloer)') l=klem_lukas323(gebjaar,doop_AD=doop,streng=streng) if l=='DOOD': doodsoorzaken.append('G-3 Lukas 3:23/Hoehner (buiten ~30, of vroeger dan 5 v.Chr.)') # kosten (zachte/interpretatieve klemmen) if mv=='zacht': kosten.append('G-1 royale marge (3 jaar vóór: 1 jaar marge)') if mv=='P': kosten.append('G-1 postulaat (4 jaar vóór: 2 jaar marge)') kosten.append('G-2 geboorteseizoen onbepaald (postulaat: %s)'%gebseiz) cel=dict(keten=keten, sterfjaar=sterfjaar, sterfseiz=sterfseiz, gebjaar=gebjaar, gebseiz=gebseiz, doop=doop) if doodsoorzaken: dood.append({cel,'door':doodsoorzaken}) else: levend.append({cel,'kosten':kosten}) return levend,dood
# ---------------------------------------------------------------- validatie tegen de terugteltabel def valideer_terugtel(): """Leeftijd bij Sukkot-geboorte, doop AD 27. 7->33, 6->32, 5->31, 4->30, 3->29, 2->28. En het ✔/~/✖ per sterfscenario.""" ok=True for bc,verwacht in [(7,33),(6,32),(5,31),(4,30),(3,29),(2,28)]: leeftijd=27+bc-1 if leeftijd!=verwacht: ok=False; print(f" MISMATCH leeftijd {bc} v.Chr.: {leeftijd} != {verwacht}") print(" leeftijdssom reproduceert de terugteltabel:", "JA" if ok else "NEE") # Mattheüs 2 hard: onder sterf voorjaar 4 v.Chr. is geboorte 3,2,1 v.Chr. uitgesloten (na de dood) for gj in [3,2,1]: mh=klem_matteus2_hard(gj,'herfst(Sukkot)',4,'voorjaar') assert mh=='DOOD', f"verwacht DOOD voor geboorte {gj} bij sterf voorjaar 4" print(" Mattheüs 2 hard sluit geboorte ná de dood uit: JA")
# ---------------------------------------------------------------- rapport def venster_per_keten(levend): per=collections.defaultdict(set) for c in levend: per[c['keten']].add(c['gebjaar']) return {k:sorted(v,reverse=True) for k,v in per.items()}
def doods_telling(dood): c=collections.Counter() for d in dood: for oorzaak in d['door']: c[oorzaak]+=1 return c
if __name__=='__main__': print("== VALIDATIE ==") valideer_terugtel() runs=[('A',True,'vrijstaand'), ('B',True,'gekoppeld, G-3 STRENG (Hoehner-vloer gebjaar<=5, doop-AD-29-specifiek)'), ('B',False,'gekoppeld, G-3 CONSISTENT (alleen Lukas 3:23-band 28..32 per doopjaar)')] for run,streng,label in runs: levend,dood=sweep(run,streng=streng) tag=f"{run}{'' if run=='A' else ('-streng' if streng else '-consistent')}" print(f"\n== RUN {tag} — {label} ==") print(f" levende cellen: {len(levend)} | dode cellen: {len(dood)}") for k,jr in venster_per_keten(levend).items(): print(f" {k}: geboortejaar {jr} v.Chr.") for oorzaak,n in doods_telling(dood).most_common(): print(f" DOOD {n:4d} {oorzaak}") outA=sweep('A'); outBs=sweep('B',streng=True); outBc=sweep('B',streng=False) json.dump(dict( A=dict(levend=outA[0],dood=outA[1]), B_streng=dict(levend=outBs[0],dood=outBs[1]), B_consistent=dict(levend=outBc[0],dood=outBc[1]), vensterA=venster_per_keten(outA[0]), vensterB_streng=venster_per_keten(outBs[0]), vensterB_consistent=venster_per_keten(outBc[0]), ), open('logigram_out.json','w'), ensure_ascii=False) print("\nlogigram_out.json geschreven")
Het logigram codeert de klemmen als predicaten, draait de variabelenruimte uit en levert de vensters, de doodsmatrix en de kosten voor run A, run B-streng en run B-consistent. Hieronder verbatim. De publicatie (https://doi.org/10.5281/zenodo.22944959) draagt hetzelfde logigram — dezelfde predicaten, dezelfde constanten, dezelfde drie runs — met voluit geschreven Engelse namen en het uitvoerpad uit de omgevingsvariabele `LOGIGRAM_OUT`; wie het draait, krijgt de cijfers van bijlage A.1 en bijlage C.
```python # -- coding: utf-8 -- """Het logigram. Machinaal berekend. Codeert de klemmenlijst v2 als predicaten, draait de variabelenruimte uit, levert de doodsmatrix en de kostenfunctie, voor run A (vrijstaand) en run B (gekoppeld).
Verankerd aan de eigen cijfers van het dossier: - de drie ketens en hun L/T/P/V/U-profiel uit het grootboek; - de eclipsscan (Espenak): zichtbare umbrale eclipsen alleen in 5,4,1 v.Chr.; - de terugteltabel (leeftijd bij doop AD 27), waartegen gevalideerd wordt.
BC-jaren als positieve gehele getallen (5 = 5 v.Chr.); groter = vroeger. 'vóór': a vóór b <=> a_bc > b_bc. Geen jaar 0: leeftijd = doop_AD + geboorte_bc - 1. """ import itertools, json, collections
# ---------------------------------------------------------------- de assen STERFJAAR = [5,4,3,2,1] # v.Chr. STERFSEIZOEN= ['voorjaar','zomer','herfst','winter'] GEBJAAR = [9,8,7,6,5,4,3,2,1] # v.Chr. GEBSEIZOEN = ['lente','zomer','herfst(Sukkot)','winter'] TELREGEL = ['inclusief','niet-inclusief','pre-dating'] JAARBEGIN = ['Nisan','Tisjri'] INVEST = [40,39] INNAME = [37,36]
SEIZOEN_ORDE = {'lente':1,'voorjaar':1,'zomer':2,'herfst':3,'herfst(Sukkot)':3,'winter':4}
# ---------------------------------------------------------------- de drie ketens (grootboek) KETENS = { 'C' : dict(inv=40, inn=37, tel='inclusief', yb='Nisan', sterfjaar=4, seizoenen=['voorjaar','winter']), 'SY': dict(inv=39, inn=36, tel='niet-inclusief',yb='Tisjri', sterfjaar=1, seizoenen=['winter']), 'CA': dict(inv=40, inn=37, tel='pre-dating', yb='Nisan', sterfjaar=4, seizoenen=['voorjaar','winter']), 'HV': dict(inv=40, inn=37, tel='inclusief', yb='vrij', sterfjaar=4, seizoenen=['voorjaar','winter']), } # ketenprofielen (ter validatie), letters over de 20 gegevens KETEN_PROFIEL = { 'C' : dict(L=10,T=5,P=2,V=0,E=0,U=3), 'SY': dict(L=7, T=2,P=8,V=3,E=0,U=0), 'CA': dict(L=9, T=4,P=0,V=1,E=0,U=6), }
# ---------------------------------------------------------------- eclips (Espenak) # umbrale eclipsen waarvan de umbra vanuit Jeruzalem/Jericho zichtbaar was, in het venster, # als (jaar v.Chr., maand, dag); 1 v.Chr. heeft er twee (10 januari totaal, 29 december partieel bij maansopkomst) ECLIPSEN_ZICHTBAAR = [(5,3,23), (5,9,15), (4,3,13), (1,1,10), (1,12,29)] # 7,6,3,2 v.Chr.: geen zichtbare umbrale eclips
# ---------------------------------------------------------------- de klemmen als predicaten # Elke klem geeft, per cel, een van: 'ok' (leest/telt legitiem), of een kost-letter, # of 'DOOD' (harde uitsluiting -> doodsmatrix).
def klem_eclips(sterfjaar): """V-1: een zichtbare umbrale eclips moet aan de dood voorafgaan: in het sterfjaar, of in de december vóór een dood vroeg in het volgende jaar. Op de eclipsdatum, niet op het kalenderjaar.""" for (j, m, d) in ECLIPSEN_ZICHTBAAR: if j == sterfjaar or (j == sterfjaar + 1 and m == 12): return 'ok' return 'DOOD'
def klem_matteus2_hard(gebjaar, gebseiz, sterfjaar, sterfseiz): "G-1 hard deel: geboorte vóór Herodes' dood. Interpretatief in de ondergrens, hard in 'niet erna'." if gebjaar > sterfjaar: return 'ok' # duidelijk vóór if gebjaar == sterfjaar: # zelfde jaar: seizoen beslist return 'ok' if SEIZOEN_ORDE[gebseiz] < SEIZOEN_ORDE[sterfseiz] else 'DOOD' return 'DOOD' # gebjaar < sterfjaar = geboren ná de dood
def klem_matteus2_vroege_rand(gebjaar, sterfjaar): """G-1 vroege rand (hoe vroeg mag de geboorte zijn). Mattheüs 2:16 "twee jaar en jonger". afstand = jaren vóór de dood. Herodes' cutoff ~2 jaar, ROYAAL genomen (HV 16 sep: Herodes rekent ruim om zeker te zijn dat de messias gedood wordt, en kan de mogelijkheid dat de ster de verwekking merkte in zijn marge hebben verdisconteerd). <=2: binnen de cutoff. 3: 1 jaar marge (de dossier-rand, 7 v.Chr. bij dood 4). 4: 2 jaar marge (duur, postulaat). >=5: leeftijd 5+, botst plat met "twee jaar en jonger" -> DOOD. De late rand (dicht op de dood) is juist ZACHT: door Herodes' royale marge kan het kind jonger zijn dan de cutoff, dus de geboorte mag vlak vóór de dood liggen.""" afstand = gebjaar - sterfjaar if afstand < 0: return 'ok' # geboren ná: door de harde klem al gevangen if afstand <= 2: return 'ok' if afstand == 3: return 'zacht' if afstand == 4: return 'P' return 'DOOD' # >=5 jaar vóór de dood
DOOP_VLOER = 27 # Tiberius' 15e jaar, inclusief geteld = de vroegst mogelijke doop (HV 16 sep) DOOP_OPTIES = [27,28,29] # Hoehner: het 15e jaar valt, naar telwijze, tussen AD 27 en 29
def klem_tiberius(doop_AD): "B-1a samengesteld: de doop kan niet vóór Tiberius' 15e jaar. 27 n.Chr. is de ondergrens (inclusief)." return 'ok' if doop_AD >= DOOP_VLOER else 'DOOD'
def klem_lukas323(gebjaar, doop_AD=27, streng=True): """G-3 (run B): Hoehner. Leeftijd = doop_AD + gebjaar - 1 (geen jaar 0). Lukas 3:23 "ongeveer dertig": ὡσεί markeert een rond getal met bescheiden speling; ±2 (Plummer, ICC op Lukas 3:23) -> leeftijd 28..32. (Hoehners ±3, 27..33, is te ruim: dan kan de toets niet falen.) Hoehners eigen vloer: geboorte 'no earlier than 5 B.C.' -> NIET vroeger dan 5 v.Chr. -> gebjaar <= 5.""" leeftijd = doop_AD + gebjaar - 1 binnen_leeftijd = 28 <= leeftijd <= 32 if streng: return 'ok' if (binnen_leeftijd and gebjaar <= 5) else 'DOOD' return 'ok' if binnen_leeftijd else 'DOOD'
# ---------------------------------------------------------------- de sweep def sweep(run, streng=True): """run 'A' (vrijstaand) of 'B' (gekoppeld, + doop 27 + Lukas 3:23/Hoehner). streng=True -> G-3 met Hoehners geïmporteerde vloer gebjaar<=5 (doop-AD-29-specifiek); streng=False -> G-3 met alleen de Lukas-3:23-leeftijdsband 28..32, per doopjaar consistent (op HV's eigen doop AD 27 geeft leeftijd 32 juist 6 v.Chr., niet 5).""" levend=[]; dood=[] doopset = DOOP_OPTIES if run=='B' else [None] for keten,kv in KETENS.items(): sterfjaar=kv['sterfjaar'] for sterfseiz in kv['seizoenen']: for gebjaar in GEBJAAR: for gebseiz in GEBSEIZOEN: for doop in doopset: doodsoorzaken=[]; kosten=[] # harde klemmen if klem_eclips(sterfjaar)=='DOOD': doodsoorzaken.append('V-1 eclips (geen zichtbare umbrale eclips vóór de dood)') mh=klem_matteus2_hard(gebjaar,gebseiz,sterfjaar,sterfseiz) if mh=='DOOD': doodsoorzaken.append('G-1 Mattheüs 2 (geboren ná de dood)') mv=klem_matteus2_vroege_rand(gebjaar,sterfjaar) if mv=='DOOD': doodsoorzaken.append('G-1 Mattheüs 2 (>=5 jaar vóór de dood; leeftijd botst met "twee jaar en jonger")') if run=='B': if klem_tiberius(doop)=='DOOD': doodsoorzaken.append('B-1a Tiberius 15e jaar (doop vóór de vloer)') l=klem_lukas323(gebjaar,doop_AD=doop,streng=streng) if l=='DOOD': doodsoorzaken.append('G-3 Lukas 3:23/Hoehner (buiten ~30, of vroeger dan 5 v.Chr.)') # kosten (zachte/interpretatieve klemmen) if mv=='zacht': kosten.append('G-1 royale marge (3 jaar vóór: 1 jaar marge)') if mv=='P': kosten.append('G-1 postulaat (4 jaar vóór: 2 jaar marge)') kosten.append('G-2 geboorteseizoen onbepaald (postulaat: %s)'%gebseiz) cel=dict(keten=keten, sterfjaar=sterfjaar, sterfseiz=sterfseiz, gebjaar=gebjaar, gebseiz=gebseiz, doop=doop) if doodsoorzaken: dood.append({cel,'door':doodsoorzaken}) else: levend.append({cel,'kosten':kosten}) return levend,dood
# ---------------------------------------------------------------- validatie tegen de terugteltabel def valideer_terugtel(): """Leeftijd bij Sukkot-geboorte, doop AD 27. 7->33, 6->32, 5->31, 4->30, 3->29, 2->28. En het ✔/~/✖ per sterfscenario.""" ok=True for bc,verwacht in [(7,33),(6,32),(5,31),(4,30),(3,29),(2,28)]: leeftijd=27+bc-1 if leeftijd!=verwacht: ok=False; print(f" MISMATCH leeftijd {bc} v.Chr.: {leeftijd} != {verwacht}") print(" leeftijdssom reproduceert de terugteltabel:", "JA" if ok else "NEE") # Mattheüs 2 hard: onder sterf voorjaar 4 v.Chr. is geboorte 3,2,1 v.Chr. uitgesloten (na de dood) for gj in [3,2,1]: mh=klem_matteus2_hard(gj,'herfst(Sukkot)',4,'voorjaar') assert mh=='DOOD', f"verwacht DOOD voor geboorte {gj} bij sterf voorjaar 4" print(" Mattheüs 2 hard sluit geboorte ná de dood uit: JA")
# ---------------------------------------------------------------- rapport def venster_per_keten(levend): per=collections.defaultdict(set) for c in levend: per[c['keten']].add(c['gebjaar']) return {k:sorted(v,reverse=True) for k,v in per.items()}
def doods_telling(dood): c=collections.Counter() for d in dood: for oorzaak in d['door']: c[oorzaak]+=1 return c
if __name__=='__main__': print("== VALIDATIE ==") valideer_terugtel() runs=[('A',True,'vrijstaand'), ('B',True,'gekoppeld, G-3 STRENG (Hoehner-vloer gebjaar<=5, doop-AD-29-specifiek)'), ('B',False,'gekoppeld, G-3 CONSISTENT (alleen Lukas 3:23-band 28..32 per doopjaar)')] for run,streng,label in runs: levend,dood=sweep(run,streng=streng) tag=f"{run}{'' if run=='A' else ('-streng' if streng else '-consistent')}" print(f"\n== RUN {tag} — {label} ==") print(f" levende cellen: {len(levend)} | dode cellen: {len(dood)}") for k,jr in venster_per_keten(levend).items(): print(f" {k}: geboortejaar {jr} v.Chr.") for oorzaak,n in doods_telling(dood).most_common(): print(f" DOOD {n:4d} {oorzaak}") outA=sweep('A'); outBs=sweep('B',streng=True); outBc=sweep('B',streng=False) json.dump(dict( A=dict(levend=outA[0],dood=outA[1]), B_streng=dict(levend=outBs[0],dood=outBs[1]), B_consistent=dict(levend=outBc[0],dood=outBc[1]), vensterA=venster_per_keten(outA[0]), vensterB_streng=venster_per_keten(outBs[0]), vensterB_consistent=venster_per_keten(outBc[0]), ), open('logigram_out.json','w'), ensure_ascii=False) print("\nlogigram_out.json geschreven")
```