完整代码: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

古代平朔历法基本算法相关推荐

  1. 基于机器学习的古代汉语自动分词标注算法及语料库研究

    摘 要 近年来,深度学习的浪潮渗透在科研和生活领域的方方面面,本文主要研究深度学习在自然语言处理,尤其是古汉语自然语言处理方面的应用.本文旨在利用计算机帮助古文研究者对古汉语完成断代.断句.分词及词性 ...

  2. 基于机器学习的古代汉语切分标注算法及语料库研究(毕业设计包含完整代码+论文+资料ppt)

    数据来源及预处理 实验所用的数据集为从网络的开放数据库下载的不同年代的古籍.根据古籍所处具体时期的不同,我们从各个时期中选择了部分书籍进行实验.将其分为成了不连续的几个时间段:春秋战国时期.后汉时期. ...

  3. 面试中sql调优的几种方式_面试方式

    面试中sql调优的几种方式 The first question I ask someone in an interview for a cybersecurity position is, &quo ...

  4. 算法系列之二十:计算中国农历(二)

    (接上篇) 所谓的"天文算法",就是利用经典力学定律推导行星运转轨道,对任意时刻的行星位置进行精确计算,从而获得某种天文现象发生时的时间,比如日月合朔这一天文现象就是太阳和月亮的地 ...

  5. 算法,天使还是魔鬼?

    随着算法的诞生,智人似乎终于制造出了一种可以实现一切愿望的工具. 如今,算法已经无孔不入,我们的工作.社交.医疗.工业.运输.贸易无不有算法的重大参与.各种算法正改变着自然科学和人文科学,让技术不断突 ...

  6. 干支纪年法简便算法_2020年天干地支对照表,干支日历表

    三僚/廖传波 "山中无甲子,寒尽不知年" 这里提到的"甲子"指的其实是天干地支的古代纪年法,引申的意思就是山中的时间变化不知不觉.这种纪年方式充分体现了古人的智 ...

  7. java人鬼过河_人鬼过河 算法 c或java

    参考答案如下 债券价值的计算,人鬼所需要的折现率是( ) 中国大学MOOC: 以下选项中,过河( )跟焊条药皮没关系. [判断题]在整个中国古代文学史上,算法戏曲并不是文学主流,但清初的明代遗民却可以 ...

  8. 秦九韶算法如何应用到计算机,《秦九韶算法》说课稿——获奖说课稿

    <<秦九韶算法>说课稿--获奖说课稿.doc>由会员分享,可免费在线阅读全文,更多与<<秦九韶算法>说课稿--获奖说课稿>相关文档资源请在帮帮文库(ww ...

  9. 转载:公历,农历相关的历法知识

    原文作者:阮一峰 点击查看原文 正文 新春期间,我忍不住又想到了一个老问题: 为什么每年春节的日期都不一样? 从2007年到2010年,春节的日期分别为2月18日.2月7日.1月26日.2月14日和2 ...

最新文章

  1. 皮一皮:有这样的妈妈挺有趣的...
  2. MySQL使用sql备份文件恢复数据库
  3. poj 1321 棋盘问题(dfs)
  4. 当深度学习遇上量化交易——因子挖掘篇
  5. 请确定指定的驱动器中是否有盘_百格拉伺服驱动器维修常见故障现象及处理方法...
  6. 2018年网络规划设计师上午真题及答案解析
  7. iOS:解决pod的Insecure world writable dir问题
  8. 赛道一双周冠军分享:我不是TFboy,所以新写了baseline
  9. python读取txt文件中的数字_在python中从文本文件读取两列数字
  10. java aciss_C语言ACISS表.doc
  11. Delphi编译后的程序图标无法修改一例
  12. C#:在u3d中操作sqlite的数据库
  13. 项目延期的4大原因及解决方案!
  14. C++图书管理系统_艾孜尔江撰
  15. 算法竞赛--计算几何
  16. 2-44钟静雯_day05
  17. More Effective C++读书笔记
  18. MySQL运行机制-从入门到京东
  19. 3570. 【GDKOI2014】壕壕的寒假作业
  20. 运用python进行熵值法综合评价

热门文章

  1. 云计算导论(第二版)李伯虎著全部课后题的答案
  2. 【AI_数学知识】概率论
  3. 魏德米勒端子eplan宏_Eplan部件库和宏全集
  4. 借win11 WSA升级12l,水一贴升级方法和说说要不要升级win11。
  5. python第四次作业——陈灵院
  6. 百新谷PCB在线下单+ERP智能生产管理系统--陪跑篇
  7. matlab实现彩色图像转成灰度图像
  8. WordPress 实战:在wordpress文章中加入分享到微博及社交网站的按钮(代码实现,非插件)
  9. Visual AssistX番茄助手的安装与基本使用
  10. 真正的能理解CSS中的line-height,height与line-height