古代平朔历法基本算法
完整代码:https://github.com/fztransit/AncientCalendar
历法基本参数及运算
class Li:def __init__(self, name, liyuan, yfa, srf, sz, qrf): # 所有历法的共有属性(历名,历元,朔策(yfa/srf),气策(sz/qrf))self.lm = nameself.ly = liyuanif yfa < srf: self.yfa = yfa + 29 * srf # 只给出余分else: self.yfa = yfaself.srf = srf # 朔日法self.yue = self.yfa / self.srfself.sdy, self.sxy = divide(self.yfa, self.srf)if sz < qrf: self.sz = sz + 365 * qrfelse: self.sz = szself.qrf = qrfself.sui = self.sz / self.qrfdef bjsgz(self, bf):self.bsgzc = round(self.sui * bf % 60) # 蔀/纪首干支差bs = 60 // math.gcd(self.bsgzc, 60) # int(self.bsgzc * 60 / math.gcd(self.bsgzc, 60) / self.bsgzc)jf = bs * bf # 甲子夜半朔旦冬至,四分历为纪法,非四分历即元法self.bsgz = [0] * bs # 蔀/纪首干支序for i in range(bs):self.bsgz[i] = (i * self.bsgzc + self.lyrgz) % 60return jfdef yrs(self, yxy): # 判断大小月if yxy < self.srf - self.sxy:self.yueri = 29return 29else:self.yueri = 30return 30def wzqy(self, ydy_0, yxy_0, qdy_0, qxy_0, qxf_0, thisYue=True): # 判断本月是否为无中气月(本月气大小余、朔大小余),无节气月亦适用if thisYue: ydy, yxy = qy(ydy_0, yxy_0, self.srf, self.sdy, self.sxy)[:2]else: ydy, yxy = ydy_0, yxy_0 # 输入即次月大小余qdy, qxy, qxf = qy(qdy_0, qxy_0, self.qrf, self.qdy, self.qxy, qxf_0, self.qxf, self.qfm)self.yrs(yxy)if (qdy - ydy) % 60 >= self.yueri: # 本月应有之中气在次月return '闰', ydy, yxy, qdy_0, qxy_0, qxf_0 # 有闰返回下月朔及本月中气else:return '', ydy, yxy, qdy, qxy, qxf # 无闰返回下月朔及下月中气class Sfl(Li):type = 1 # 第一类:四分历yfa = 27759srf = 940bf = 76sz = 1461qrf = 4df = 32zs = 19zr = 7jys = 605qfm = 1qxf = 0def __init__(self, name, liyuan, **kwargs):self.sz *= (self.df / self.qrf)self.qrf = self.dfLi.__init__(self, name, liyuan, self.yfa, self.srf, self.sz, self.qrf)self.qdy, self.qxy = divide(self.sz / 12, self.qrf)try:self.lyjzss = kwargs['lyjzss']except:self.lyjzss = ['冬至', '子', '子']self.basicData(kwargs)self.jf = self.bjsgz(self.bf)self.yf = self.jf * 60 // math.gcd(self.jf, 60) # 元法(岁复甲子)def basicData(self, kwargs):# 可能存在的参数,不存在赋默认值self.zqi = self.sui / 12self.zq = self.zs * 12 # 章气=章岁*12self.zy = self.zq + self.zr # 章月=章气+章闰=章岁*12+章闰self.qly = jieqi.index(self.lyjzss[0])self.jian = dizhi.index(self.lyjzss[1])self.suis = dizhi.index(self.lyjzss[2])if 6 < self.suis < 12: self.suis -= 12try: self.lyrgz = gz.index(kwargs['lyrgz'])except: self.lyrgz = 0try:self.bsry = kwargs['bsry']self.lyry = True # 有闰余,历元不正except:self.bsry = 0self.lyry = Falsetry: self.bm = kwargs['bm']except: self.bm = ['蔀'] # 无蔀/纪名def array(self, rank): # 根据不同排表要求修改# 建表用数据(修改岁首月确定排表用的每年第一个月)rank = 1if rank == -1: self.ssy = self.suis if self.suis < 0 else 0 # 冬至和岁首的最小值elif rank == 0: self.ssy = 0 # 冬至起排elif rank == 1: self.ssy = self.suis # 从岁首起排elif rank == 2: self.ssy = self.suis if self.suis > 0 else 0 # 冬至和岁首的最大值if self.qly % 2 == 1: # 节气为历元,而岁首为中气,需转换self.bsry = (((self.zqi/2) / self.yue * 228) - self.zr * ((self.qly+1) / 2 - self.ssy)) / 12 # 单位:月self.backYue = self.ssy - (self.qly + 1) // 2self.backQi = self.ssy - self.qly / 2self.jzy = self.jian - self.ssy # 建正所在的月def dygz(self, dy): # 由蔀首开始求的大余转为干支需加上蔀首干支序if dy == None: return ' 无 'gzdy = (dy + self.bsgz[self.rbs]) % 60return gz[gzdy]def syjn(self, year): # 算外self.sy = -self.ly + self.jys * self.yf # 上元jn = self.sy + yearif year > 0: jn -= 1 # 实际为jn-=1; if year<0,jn+=1return jnclass Psl(Sfl, Li):type = 2 # 第二类:使用平朔平气法的历def __init__(self, name, liyuan, yfa, srf, sz, qrf, zhang, **kwargs):Li.__init__(self, name, liyuan, yfa, srf, sz, qrf) # 指定父类的构造函数try:self.qrf = kwargs['df'] # 度法,纪法约/倍数self.sz = int(self.sz * self.qrf / qrf)except: passif self.sz / 24 != self.sz // 24:self.qfm = 24self.qxf = int(self.sz - self.sz // 24 * 24) * 2else:self.qfm, self.qxf = 1, 0self.qdy, self.qxy = divide((self.sz - self.qxf // 2) / 12, self.qrf)self.zs, self.zr = zhangtry: self.lyjzss = kwargs['lyjzss']except: self.lyjzss = ['冬至','寅','寅']try: self.jf = kwargs['jf'] # 纪法(夜半朔旦冬至)except: self.jf = qrfself.bf = qrfself.basicData(kwargs)self.yf = self.bjsgz(self.bf) # 元法(甲子夜半朔旦冬至)try: self.jys = kwargs['jys']except: self.jys = 0
基本推步函数
# 求大小余
def divide(dividend, divisor, flag=False):quotient = dividend // divisorremainder = dividend % divisorif flag: quotient %= 60return int(quotient), int(remainder)# 大小余加减运算
def qy(dy1, xy1, rf, dy2, xy2, xf1=0, xf2=0, fm=1, n=1): # 被加/减数,日法,加/减数,被加/减数小分,加/减数小分,分母,加/减次数zf = ((dy1 * rf + xy1) * fm + xf1) + ((dy2 * rf + xy2) * fm + xf2) * nxf = zf % fmzy = (zf - xf) // fmdy = int(zy // rf)xy = zy % rfif fm == 1: return dy % 60, xy + xf, xfelse: return dy % 60, int(xy), xf# 求天正朔
def tzs(li, year, rank=-1): # rank=-1时历元为冬至即天正气朔,=1时即岁首气朔li.array(rank)# 基本推步算法jn = li.syjn(year)li.rbn = jn % li.bf # +1入蔀年if li.type == 1: li.rbs = jn % li.jf // li.bf # +1入蔀数else:if li.jf == li.bf: li.rbs = jn % li.yf // li.jf # +1入纪数else: li.rbs = jn % li.yf // li.bf # +1入蔀数jy = (li.rbn * li.zy) // li.zs # 蔀内积月,每年235/19月li.ry = li.rbn * li.zy % li.zs # 闰余 rbn * zy - jy * zfif li.bsry > 0: # 首月中气非朔if li.lyry: jy -= li.bsry / li.zs # 历元有闰余,转到无闰余日if li.ry + li.bsry >= li.zs: jy += 1 # 上一年有闰,需加回li.ry = (li.bsry + li.zy * li.rbn) % li.zsydy, yxy = divide(jy * li.yfa, li.srf, True) # 天正朔蔀内积日 = 积月 * 朔策(yfa / srf)qdy, qxy = divide(li.rbn * li.sz, li.qrf, True) # 中气积日 = 积年 * 岁长qxf = 0if (qdy - ydy) % 60 >= li.yrs(yxy): # 首月为闰月ydy, yxy = qy(ydy, yxy, li.srf, li.sdy, li.sxy)[:2]# 根据历元和建正修改至天正冬至或岁首月if li.backYue != 0 and li.backQi != 0: # 非天正冬至需回推ydy, yxy, qdy, qxy, qxf = epoch2tz(li, ydy, yxy, qdy, qxy, qxf)else: li.yrs(yxy)if li.rbn == 0 and li.ssy < li.qly/2: # 回推时跨到上一蔀(岁首<历元)ydy = (ydy + li.bsgzc) % 60qdy = (qdy + li.bsgzc) % 60return ydy, yxy, qdy, qxy, qxf
古代平朔历法基本算法相关推荐
- 基于机器学习的古代汉语自动分词标注算法及语料库研究
摘 要 近年来,深度学习的浪潮渗透在科研和生活领域的方方面面,本文主要研究深度学习在自然语言处理,尤其是古汉语自然语言处理方面的应用.本文旨在利用计算机帮助古文研究者对古汉语完成断代.断句.分词及词性 ...
- 基于机器学习的古代汉语切分标注算法及语料库研究(毕业设计包含完整代码+论文+资料ppt)
数据来源及预处理 实验所用的数据集为从网络的开放数据库下载的不同年代的古籍.根据古籍所处具体时期的不同,我们从各个时期中选择了部分书籍进行实验.将其分为成了不连续的几个时间段:春秋战国时期.后汉时期. ...
- 面试中sql调优的几种方式_面试方式
面试中sql调优的几种方式 The first question I ask someone in an interview for a cybersecurity position is, &quo ...
- 算法系列之二十:计算中国农历(二)
(接上篇) 所谓的"天文算法",就是利用经典力学定律推导行星运转轨道,对任意时刻的行星位置进行精确计算,从而获得某种天文现象发生时的时间,比如日月合朔这一天文现象就是太阳和月亮的地 ...
- 算法,天使还是魔鬼?
随着算法的诞生,智人似乎终于制造出了一种可以实现一切愿望的工具. 如今,算法已经无孔不入,我们的工作.社交.医疗.工业.运输.贸易无不有算法的重大参与.各种算法正改变着自然科学和人文科学,让技术不断突 ...
- 干支纪年法简便算法_2020年天干地支对照表,干支日历表
三僚/廖传波 "山中无甲子,寒尽不知年" 这里提到的"甲子"指的其实是天干地支的古代纪年法,引申的意思就是山中的时间变化不知不觉.这种纪年方式充分体现了古人的智 ...
- java人鬼过河_人鬼过河 算法 c或java
参考答案如下 债券价值的计算,人鬼所需要的折现率是( ) 中国大学MOOC: 以下选项中,过河( )跟焊条药皮没关系. [判断题]在整个中国古代文学史上,算法戏曲并不是文学主流,但清初的明代遗民却可以 ...
- 秦九韶算法如何应用到计算机,《秦九韶算法》说课稿——获奖说课稿
<<秦九韶算法>说课稿--获奖说课稿.doc>由会员分享,可免费在线阅读全文,更多与<<秦九韶算法>说课稿--获奖说课稿>相关文档资源请在帮帮文库(ww ...
- 转载:公历,农历相关的历法知识
原文作者:阮一峰 点击查看原文 正文 新春期间,我忍不住又想到了一个老问题: 为什么每年春节的日期都不一样? 从2007年到2010年,春节的日期分别为2月18日.2月7日.1月26日.2月14日和2 ...
最新文章
- 皮一皮:有这样的妈妈挺有趣的...
- MySQL使用sql备份文件恢复数据库
- poj 1321 棋盘问题(dfs)
- 当深度学习遇上量化交易——因子挖掘篇
- 请确定指定的驱动器中是否有盘_百格拉伺服驱动器维修常见故障现象及处理方法...
- 2018年网络规划设计师上午真题及答案解析
- iOS:解决pod的Insecure world writable dir问题
- 赛道一双周冠军分享:我不是TFboy,所以新写了baseline
- python读取txt文件中的数字_在python中从文本文件读取两列数字
- java aciss_C语言ACISS表.doc
- Delphi编译后的程序图标无法修改一例
- C#:在u3d中操作sqlite的数据库
- 项目延期的4大原因及解决方案!
- C++图书管理系统_艾孜尔江撰
- 算法竞赛--计算几何
- 2-44钟静雯_day05
- More Effective C++读书笔记
- MySQL运行机制-从入门到京东
- 3570. 【GDKOI2014】壕壕的寒假作业
- 运用python进行熵值法综合评价
热门文章
- 云计算导论(第二版)李伯虎著全部课后题的答案
- 【AI_数学知识】概率论
- 魏德米勒端子eplan宏_Eplan部件库和宏全集
- 借win11 WSA升级12l,水一贴升级方法和说说要不要升级win11。
- python第四次作业——陈灵院
- 百新谷PCB在线下单+ERP智能生产管理系统--陪跑篇
- matlab实现彩色图像转成灰度图像
- WordPress 实战:在wordpress文章中加入分享到微博及社交网站的按钮(代码实现,非插件)
- Visual AssistX番茄助手的安装与基本使用
- 真正的能理解CSS中的line-height,height与line-height