1091 N-自守数 (15 分) 还有 测试点2

该博客介绍了PAT编程竞赛中的一道题目——1091 N-自守数。博主分享了自己在解题过程中的经历,由于忽视了题目中的关键条件‘N<10’,导致在测试点2上出错。文章详细阐述了题目的要求,即找到一个数K,其平方乘以N后,结果的末尾与N相同。博主提供了正确的解题思路,即遍历1到9,用公式验证是否满足N-自守数的条件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

写完第一感觉 我又被骗了!!

首先 测试点2 的数据是 

9

9 8 7 6 5 4 3 2 1

我犯了一个错误,就是没有看见 “注意题目保证 N<10。” 结果程序写成了 N<输入的数 导致第二个测试点错误。 所以要看题目啊,谨防被骗。(狗头~~)

因为大二到大三忙着做项目还有忙着各种考试,所以好久没写了,就今天一写,还被骗了。啊哈哈~

题目

如果某个数 K 的平方乘以 N 以后,结果的末尾几位数等于 K,那么就称这个数为“N-自守数”。例如 3×92​2​​=25392,而 25392 的末尾两位正好是 92,所以 92 是一个 3-自守数。

本题就请你编写程序判断一个给定的数字是否关于某个 N 是 N-自守数。

输入格式:

输入在第一行中给出正整数 M(≤20),随后一行给出 M 个待检测的、不超过 1000 的正整数。

输出格式:

对每个需要检测的数字,如果它是 N-自守数就在一行中输出最小的 N 和 NK​2​​ 的值,以一个空格隔开;否则输出 No。注意题目保证 N<10。

输入样例:

3
92 5 233

输出样例:

3 25392
1 25
No

 

思路:简单推导一下&

import numpy as np import matplotlib.pyplot as plt from tenpy.models.model import CouplingModel, NearestNeighborModel from tenpy.networks.site import BosonSite from tenpy.models.lattice import Chain from tenpy.networks.mps import MPS from tenpy.algorithms import dmrg # 自定义 Bose-Hubbard 模型(保持不变) class BoseHubbardModel(CouplingModel, NearestNeighborModel): def __init__(self, L, t, U, V, n_max, bc_MPS=&#39;finite&#39;): site = BosonSite(Nmax=n_max, conserve=&#39;N&#39;) lat = Chain(L=L, site=site, bc=&#39;open&#39;, bc_MPS=bc_MPS) CouplingModel.__init__(self, lat) self.add_coupling(-t, 0, &#39;Bd&#39;, 0, &#39;B&#39;, 1, plus_hc=True) self.add_onsite(U/2, 0, &#39;N N&#39;) self.add_coupling(V, 0, &#39;N&#39;, 0, &#39;N&#39;, 1) self.H_bond = self.calc_H_bond() NearestNeighborModel.__init__(self, lat, self.H_bond) # 参设置(保持不变) L = 20 U_values = np.linspace(0, 10, 20) t = 1.0 V = 0.5 n_max = 3 chi = 100 # 初始化存储组 energies = [] number_fluctuations = [] # 主循环:遍历不同的U值 for U in U_values: print(f"Running DMRG for U = {U:.2f}") # 1. 初始化模型 model = BoseHubbardModel(L=L, t=t, U=U, V=V, n_max=n_max) # 2. 制备初始态(每个格点填充1个粒子) psi = MPS.from_product_state(model.lat.mps_sites(), [1]*L, bc=model.lat.bc_MPS) # 3. 配置DMRG参 dmrg_params = { &#39;trunc_params&#39;: { &#39;chi_max&#39;: chi, &#39;svd_min&#39;: 1e-10 }, &#39;max_E_err&#39;: 1e-6, &#39;verbose&#39;: 0 } # 4. 运行DMRG info = dmrg.run(psi, model, dmrg_params) # 5. 收集据 energies.append(info[&#39;E&#39;]) # 计算粒子涨落 fluctuation = 0.0 for i in range(L): N = psi.expectation_value(&#39;N&#39;, sites=[i]) N_sq = psi.expectation_value(&#39;N N&#39;, sites=[i]) fluctuation += (N_sq - N**2) number_fluctuations.append(fluctuation/L) # 平均每个格点的涨落 # 绘制结果 plt.figure(figsize=(10, 5)) # 基态能量 plt.subplot(1, 2, 1) plt.plot(U_values, energies, &#39;o-&#39;) plt.xlabel(&#39;U/t&#39;) plt.ylabel(&#39;Ground State Energy&#39;) plt.grid(alpha=0.6) # 粒子涨落 plt.subplot(1, 2, 2) plt.plot(U_values, number_fluctuations, &#39;s-&#39;) plt.xlabel(&#39;U/t&#39;) plt.ylabel(&#39;Number Fluctuation ⟨n&sup2;⟩ - ⟨n⟩&sup2;&#39;) plt.grid(alpha=0.6) plt.tight_layout() plt.show()
最新发布
04-03
<think>好的,我需要帮助用户理解他们提供的这段Python代码。首先,我应该仔细阅读代码,明确它的结构和各个部的功能。看起来这是一个使用TenPy库来研究Bose-Hubbard模型的脚本,通过DMRG算法计算基态能量和粒子涨落随U参的变化。 首先,用户可能想了解代码的整体目的。代码主要是在模拟一维玻色子在Bose-Hubbard模型下的基态性质,通过改变相互作用强度U,观察能量和粒子涨落的变化。这可能与量子相变有关,比如从超流态到Mott绝缘态的转变。 接下来,我需要解析代码。首先是导入的库:numpy、matplotlib,以及TenPy的相关模块。TenPy是处理张量网络算法的库,特别适用于量子多体系统的模拟。用户可能对TenPy不太熟悉,需要简单介绍这些模块的作用,比如CouplingModel用于构建模型,BosonSite表示玻色子格点,DMRG是算法部。 然后是自定义的BoseHubbardModel类,继承自CouplingModel和NearestNeighborModel。这里需要解释类的初始化过程,如何添加耦合项、在位项等。参L是链的长度,t是跃迁强度,U是在位相互作用,V是最近邻相互作用,n_max是每个格点的最大粒子。这部可能对于不熟悉模型构建的用户来说比较复杂,需要详细说明每个add_coupling的作用,例如第一项是动能项,包含产生和湮灭算符的最近邻跃迁,使用plus_hc来添加厄米共轭项;第二项是U项,对应粒子间的在位排斥或吸引;第三项是V项,相邻格点的粒子相互作用。 参设置部,L=20,U从0到10取20个点,t=1,V=0.5,n_max=3,chi=100。需要解释这些参的意义,特别是chi是DMRG中的键维度,影响计算的精度和资源消耗。 主循环部遍历不同的U值,每个U下构建模型、初始化MPS态、运行DMRG、计算期望值。这里需要解释MPS.from_product_state创建初始态的过程,每个格点填充一个粒子。DMRG参设置中的截断参和收敛条件也需要说明,比如chi_max是最大键维,svd_min是奇异值截断的最小值,max_E_err是能量误差的收敛标准。 据收集部,计算基态能量和每个格点的粒子涨落。涨落的计算是⟨n&sup2;⟩ - ⟨n⟩&sup2;,对每个格点求和后取平均。这里需要强调涨落的大小与系统的超流特性相关,U增大时涨落减小,可能指示相变。 绘图部使用matplotlib展示能量和涨落随U的变化。两个子图别对应基态能量和平均涨落,横轴是U/t,这可能让用户更容易理解无量纲的参比例。 用户可能的疑问点包括:DMRG算法的工作原理、Bose-Hubbard模型的物理意义、如何解释能量和涨落的变化趋势、参选择的影响(如chi的大小,L是否足够大,n_max是否合适)。此外,可能需要解释代码中一些TenPy特有的方法,比如expectation_value的参&#39;N&#39;和&#39;N N&#39;,以及模型的构建细节。 可能的扩展问题:如何调整代码以研究其他参(如V或t)的影响?如何验证结果的正确性?DMRG在此类问题中的优势和局限性是什么?如何析相变点的位置? 总结来说,我需要将代码解为几个主要部,逐步解释每部的功能,相关物理概念,以及代码实现的方法。同时,需要联系物理理论,解释结果的可能意义,帮助用户将代码与物理现象联系起来。</think>以下是对该代码的逐步解析: 一、代码功能概述 该代码使用张量网络算法(DMRG)研究一维Bose-Hubbard模型的量子相变行为,主要计算两个物理量随相互作用强度$U$的变化: 1. 基态能量 2. 粒子涨落$\langle n^2 \rangle - \langle n \rangle^2$ 二、代码结构解析 $1. 库导入部$ ```python import numpy as np import matplotlib.pyplot as plt from tenpy.models.model import CouplingModel, NearestNeighborModel from tenpy.networks.site import BosonSite from tenpy.models.lattice import Chain from tenpy.networks.mps import MPS from tenpy.algorithms import dmrg ``` - TenPy:量子多体系统模拟框架 - BosonSite定义玻色子格点,包含粒子算符$N$和湮灭算符$B$ - MPS表示矩阵乘积态,DMRG的核心据结构 $2. 模型定义$ ```python class BoseHubbardModel(CouplingModel, NearestNeighborModel): def __init__(self, L, t, U, V, n_max, bc_MPS=&#39;finite&#39;): site = BosonSite(Nmax=n_max, conserve=&#39;N&#39;) # 最大粒子n_max,守恒量N lat = Chain(L=L, site=site, bc=&#39;open&#39;) # 一维开边界链 CouplingModel.__init__(self, lat) # 添加三项相互作用: self.add_coupling(-t, 0, &#39;Bd&#39;, 0, &#39;B&#39;, 1, plus_hc=True) # 跃迁项 self.add_onsite(U/2, 0, &#39;N N&#39;) # 在位相互作用 self.add_coupling(V, 0, &#39;N&#39;, 0, &#39;N&#39;, 1) # 近邻密度相互作用 ``` 三项相互作用对应的哈密顿量: $$H = -t\sum_i (b_i^\dagger b_{i+1} + h.c.) + \frac{U}{2}\sum_i n_i(n_i-1) + V\sum_i n_i n_{i+1}$$ $3. 参设置$ ```python L = 20 # 系统尺寸 U_values = np.linspace(0, 10, 20) # U/t取值范围 t = 1.0 # 跃迁强度(基准单位) V = 0.5 # 近邻相互作用 n_max = 3 # 单点最大粒子 chi = 100 # DMRG键维度(控制计算精度) ``` $4. DMRG计算流程$ ```python for U in U_values: model = BoseHubbardModel(L=L, t=t, U=U, V=V, n_max=n_max) psi = MPS.from_product_state(model.lat.mps_sites(), [1]*L) # 初态:每个格点1粒子 dmrg_params = {&#39;trunc_params&#39;: {&#39;chi_max&#39;: chi, &#39;svd_min&#39;: 1e-10}, ...} dmrg.run(psi, model, dmrg_params) # 执行DMRG优化 ``` $5. 物理量计算$ ```python # 粒子涨落计算 for i in range(L): N = psi.expectation_value(&#39;N&#39;, sites=[i]) # ⟨n_i⟩ N_sq = psi.expectation_value(&#39;N N&#39;, sites=[i]) # ⟨n_i^2⟩ fluctuation += (N_sq - N**2) # ⟨n&sup2;⟩ - ⟨n⟩&sup2; ``` 三、物理图像析 1. 基态能量曲线:随着$U/t$增大,能量单调上升,反映强排斥相互作用增加系统能量 2. 粒子涨落曲线: - 当$U/t \to 0$时:涨落较大,系统处于超流态 - 当$U/t$增大时:涨落减小,系统向Mott绝缘体转变 - 典型相变点$U_c \approx 3.37t$(一维精确解) 四、参选择建议 1. 系统尺寸$L$:需测试有限尺寸效应,通常取$L\geq 20$ 2. 键维度$\chi$:影响计算精度,可通过监测纠缠熵收敛性验证 3. 最大粒子$n_{max}$:需确保截断误差可忽略,通常取$n_{max}\geq 3$ 五、扩展研究方向 1. 添加无序势研究局域化现象 2. 计算纠缠熵析量子临界点 3. 研究有限温度性质 4. 推广到二维系统研究 执行代码后将得到两个子图,左图显示基态能量随$U/t$的变化趋势,右图显示粒子涨落的演化特征,这些结果为析量子相变提供了重要值依据。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值