使用jQuery Ajax功能的时候需要注意的一个问题
被涯旅购上述每次divstep迭代可以表示为矩阵乘法对向量[f g]和[d e]应用如下的转换矩阵1/2*timage其中根据迭代中分支的不同(u, v, q, r)分别有不同的取值(0, 2, -1, 1)(2, 0, 1, 1)(2, 0, 0, 1)在while每次迭代中都会用转换矩阵乘于相应的向量而在转换矩阵中又包含除于2的操作这样整个while循环会包含除于2N的操作对于f和g来说算法已经保证了每次迭代的除法可以通过移位来实现而对于d和e来说这些个除法是非常费时的操作所以可以在每次迭代的矩阵乘法时不执行除于2的操作而把该除法操作留到最后步骤执行除于2N操作由此得到以下函数复制代码def divsteps_n_matrix(delta, f, g):Compute delta and transition matrix t after N divsteps (multiplied by 2^N).u, v, q, r 1, 0, 0, 1 # start with identity matrixfor _ in range(N):if delta 0 and g 1:delta, f, g, u, v, q, r 1 - delta, g, (g - f) // 2, 2*q, 2*r, q-u, r-velif g 1:delta, f, g, u, v, q, r 1 delta, f, (g f) // 2, 2*u, 2*v, qu, rvelse:delta, f, g, u, v, q, r 1 delta, f, (g ) // 2, 2*u, 2*v, q , rreturn delta, (u, v, q, r)复制代码后续还需进行如下计算image由推导过程可知最后uvqr组成的矩阵乘于初始向量[f g]以后得出的向量每个元素都是2N的倍数可由初始值实际验算下所以有以下的更新函数复制代码def update_fg(f, g, t):Multiply matrix t/2^N with [f, g].u, v, q, r tcf, cg u*f v*g, q*f r*g# (t / 2^N) should cleanly apply to [f,g] so the result of t*[f,g] should have N zero# bottom bits.assert cf % 2**N 0assert cg % 2**N 0return cf N, cg N复制代码对于d和e来说上述结论并不成立这里需要一个和div2函数类似的在模M下除于2N的函数借助该函数可实现de的更新复制代码def div2n(M, Mi, x):Compute x/2^N mod M, given Mi 1/M mod 2^N.assert (M * Mi) % 2**N 1# Find a factor m such that m*M has the same bottom N bits as x. We want:# (m * M) mod 2^N x mod 2^N# m mod 2^N (x / M) mod 2^N# m mod 2^N (x * Mi) mod 2^Nm (Mi * x) % 2**N# Subtract that multiple from x, cancelling its bottom N bits.x - m * M# Now a clean division by 2^N is possible.assert x % 2**N 0return (x N) % Mdef update_de(d, e, t, M, Mi):Multiply matrix t/2^N with [d, e], modulo M.u, v, q, r tcd, ce u*d v*e, q*d r*ereturn div2n(M, Mi, cd), div2n(M, Mi, ce)复制代码综合上述所有即可给出执行N divsteps版本的modinv函数复制代码def modinv(M, Mi, x):Compute the modular inverse of x mod M, given Mi1/M mod 2^N.assert M 1delta, f, g, d, e 1, M, x, 0, 1while g ! 0:# Compute the delta and transition matrix t for the next N divsteps (this only needs# (N1)-bit signed integer arithmetic).delta, t divsteps_n_matrix(delta, f % 2**N, g % 2**N)# Apply the transition matrix t to [f, g]:f, g update_fg(f, g, t)# Apply the transition matrix t to [d, e]:d, e update_de(d, e, t, M, Mi)return (d * f) % M复制代码这意味着在实践中我们将始终执行多个N个div步骤。这不是问题因为一旦g0进一步的divsteps就不再影响f、g、d或e只有δ继续增加这就能保证不管输入是何止算法运行步骤一致从而保证了算法时间一致性。3.3 secp256k1_modinv32源码分析结合上述内容分析下模逆的核心函数secp256k1_modinv32其源码如下复制代码1 /* Compute the inverse of x modulo modinfo-modulus, and replace x with it (constant time in x). */2 static void secp256k1_modinv32(secp256k1_modinv32_signed30 *x, const secp256k1_modinv32_modinfo *modinfo) {3 /* Start with d0, e1, fmodulus, gx, zeta-1. */4 secp256k1_modinv32_signed30 d {{0}};5 secp256k1_modinv32_signed30 e {{1}};6 secp256k1_modinv32_signed30 f modinfo-modulus;7 secp256k1_modinv32_signed30 g *x;8 int i;9 int32_t zeta -1; /* zeta -(delta1/2); delta is initially 1/2. */1011 /* Do 20 iterations of 30 divsteps each 600 divsteps. 590 suffices for 256-bit inputs. */12 for (i 0; i 20; i) {13 /* Compute transition matrix and new zeta after 30 divsteps. */14 secp256k1_modinv32_trans2x2 t;15 zeta secp256k1_modinv32_divsteps_30(zeta, f.v[0], g.v[0], t);16 /* Update d,e using that transition matrix. */17 secp256k1_modinv32_update_de_30(d, e, t, modinfo);18 /* Update f,g using that transition matrix. */19 VERIFY_CHECK(secp256k1_modinv32_mul_cmp_30(f, 9, modinfo-modulus, -1) 0); /* f -modulus */20 VERIFY_CHECK(secp256k1_modinv32_mul_cmp_30(f, 9, modinfo-modulus, 1) 0); /* f modulus */21 VERIFY_CHECK(secp256k1_modinv32_mul_cmp_30(g, 9, modinfo-modulus, -1) 0); /* g -modulus */22 VERIFY_CHECK(secp256k1_modinv32_mul_cmp_30(g, 9, modinfo-modulus, 1) 0); /* g modulus */2324 secp256k1_modinv32_update_fg_30(f, g, t);2526 VERIFY_CHECK(secp256k1_modinv32_mul_cmp_30(f, 9, modinfo-modulus, -1) 0); /* f -modulus */27 VERIFY_CHECK(secp256k1_modinv32_mul_cmp_30(f, 9, modinfo-modulus, 1) 0); /* f modulus */28 VERIFY_CHECK(secp256k1_modinv32_mul_cmp_30(g, 9, modinfo-modulus, -1) 0); /* g -modulus */29 VERIFY_CHECK(secp256k1_modinv32_mul_cmp_30(g, 9, modinfo-modulus, 1) 0); /* g modulus */30 }3132 /* At this point sufficient iterations have been performed that g must have reached 033 * and (if g was not originally 0) f must now equal /- GCD of the initial f, g34 * values i.e. /- 1, and d now contains /- the modular inverse. */3536 /* g 0 */37 VERIFY_CHECK(secp256k1_modinv32_mul_cmp_30(g, 9, SECP256K1_SIGNED30_ONE, 0) 0);38 /* |f| 1, or (x 0 and d 0 and f modulus) */39 VERIFY_CHECK(secp256k1_modinv32_mul_cmp_30(f, 9, SECP256K1_SIGNED30_ONE, -1) 0 ||40 secp256k1_modinv32_mul_cmp_30(f, 9, SECP256K1_SIGNED30_ONE, 1) 0 ||41 (secp256k1_modinv32_mul_cmp_30(x, 9, SECP256K1_SIGNED30_ONE, 0) 0 42 secp256k1_modinv32_mul_cmp_30(d, 9, SECP256K1_SIGNED30_ONE, 0) 0 43 secp256k1_modinv32_mul_cmp_30(f, 9, modinfo-modulus, 1) 0));4445 /* Optionally negate d, normalize to [0,modulus), and return it. */46 secp256k1_modinv32_normalize_30(d, f.v[8], modinfo);47 *x d;48 }复制代码函数整体流程和上一节的介绍基本一致不再进行详细分析这里重点分析下函数中容易让人困惑的几个点。1. 参数zeta在代码一开始引入映射zeta -(delta1/2)则在delta取值1/2时zeta取值为-1以此为起点进行迭代在zeta引入后有以下迭代分支zeta0 且 g1zeta-zeta-2对应之前delta0且g1分支(zeta0 且 g1)或g为偶数zetazeta-1对应之前delta另外另种分支这样进行精心设计的好处是能用能用移位异或等操作完全替换比较操作在密码学领域消除分支判断实现运行恒定时间。secp256k1_modinv32_divsteps_30代码中zeta核心更新逻辑如下复制代码1 /* Compute conditional masks for (zeta 0) and for (g 1). */2 c1 zeta 31;3 mask1 c1;4 c2 g 1;5 mask2 -c2;6 mask1 mask2;7 /* Conditionally change zeta into -zeta-2 or zeta-1. */8 zeta (zeta ^ mask1) - 1;复制代码第2行处代码用于获取zeta符号当zeta为非负数时c10当zeta为负数时c10xFFFFFFFF所以对于mask1来说要么取值为0要么为0xFFFFFFFF。第3行当g为奇数时c21对应mask2为0xFFFFFFFF当g为偶数时c20对应mask2为0。第6行表明当g 奇数 且 zeta 0时mask1取值为0xFFFFFFFF这时第8行zeta(zeta ^ -1) - 1 (~zeta) - 1 -zeta -1 - 1 -zeta-2即对应之前说的分支1而其他情况下zeta zeta -1。2. 迭代次数在Bernstein–Yang的论文 “Fast constant-time gcd computation and modular inversion” 中给出对于n位整数输入需要的最大divsteps数量大约是2nC其中C是一个很小的常数。另外文中也说了在1.45n divsteps已经足够保证收敛但是现实里通常会再留安全裕度。在secp256k1的实现里选择600 divsteps作为固定上限方便分组且有足够裕度实际是只需要590 divsteps就能保证覆盖256位输入的最坏情况这里590的数字来自对 safegcd 算法的 worst-case 分析参考 secp256k1 开发者文档和论文中的 bound即在 256 位范围内任意输入的 GCD 计算最多 590 步就一定能结束。在库实现中最终进行了20x30分组这样的好处是批处理 (batching)每次不做 1 个 divstep而是“打包”多个这里是 30 个用矩阵乘法批量更新系数这样减少分支、提高效率。20 组 × 30 步 600 步实现里用固定循环展开保证 constant-time无论输入是什么都走一样的循环次数。所以这两个数字30 和 20并不是数学限制而是工程上选择的「批大小」和「循环次数」。

相关新闻

用最简单的例子,从最简单的设计开始,重构着讲解设计原则与模式——从DIP中“倒置”的含义说接口的正确使用

用最简单的例子,从最简单的设计开始,重构着讲解设计原则与模式——从DIP中“倒置”的含义说接口的正确使用

钙沿雌闲1 magnitude及normalized 由于当前许多项目都用到secp256k1库,比特币作为体量最大的数字货币项目,这里建议直接参考bitcoin-core提供的最新secp256k1源码。仍以field的10x26实现版本为例,相关定义如下: 复制代码 /** This…

2026/7/6 22:42:53 阅读更多 →
E2E UI 监控系统框架:Python + Selenium + Docker + GitHub Actions + Prometheus

E2E UI 监控系统框架:Python + Selenium + Docker + GitHub Actions + Prometheus

本文将手把手教你从零开始搭建一个端到端(E2E)UI 监控系统。即使你没有相关经验,也能跟着步骤一步步完成! 📋 前置要求 在开始之前,请确保你的电脑已安装以下工具: Python 3.8 - 编程语言环境Do…

2026/7/6 11:27:33 阅读更多 →
C# 温故而知新:Stream篇(五)

C# 温故而知新:Stream篇(五)

俗涯也岩在 AI 编程工具从 “代码补全助手” 向 “全流程开发伙伴” 演进的关键阶段,生成效果的竞争已不再局限于单一代码片段的正确性,而是延伸至工程化落地、行业合规适配与团队协作效率的多维战场。本文结合腾讯云官方数据与行业实践,从技…

2026/7/6 21:35:21 阅读更多 →

最新新闻

TPA3138D2音频放大器与STM32F217ZG的协同设计优化

TPA3138D2音频放大器与STM32F217ZG的协同设计优化

1. TPA3138D2音频放大器的核心特性解析TPA3138D2作为德州仪器(TI)推出的D类音频放大器芯片,在便携式音频设备设计中展现出独特优势。这款芯片采用无电感器设计,在3.5V至14.4V宽电压范围内可提供每通道10W的立体声输出功率,特别适合电池供电的…

2026/7/7 13:12:24 阅读更多 →
Runway三模型策略解析:AI视频生成如何匹配真实工作场景

Runway三模型策略解析:AI视频生成如何匹配真实工作场景

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 上周,当我像往常一样打开几个常用的AI工具平台准备处理一批视频素材时,突然发现Runway的界面出现了一些微妙的…

2026/7/7 13:10:24 阅读更多 →
智能告警分析引擎:用AI区分真实告警与噪声信号

智能告警分析引擎:用AI区分真实告警与噪声信号

智能告警分析引擎:用AI区分真实告警与噪声信号 一、从"告警洪泛"到"精准诊断"的噪声治理 大型微服务系统的告警洪泛是运维效率的核心障碍:一个节点网络抖动可能触发上游依赖链的级联告警,产生数十条重复或关联告警&#…

2026/7/7 13:04:23 阅读更多 →
5分钟掌握SPT-AKI Profile Editor:高效管理你的离线塔科夫存档

5分钟掌握SPT-AKI Profile Editor:高效管理你的离线塔科夫存档

5分钟掌握SPT-AKI Profile Editor:高效管理你的离线塔科夫存档 【免费下载链接】SPT-AKI-Profile-Editor Программа для редактирования профиля игрока на сервере SPT-AKI 项目地址: https://gitcode.com/gh_m…

2026/7/7 13:04:23 阅读更多 →
新乡旧车间改造翻新|河南老旧食品厂房拆除改造施工要点

新乡旧车间改造翻新|河南老旧食品厂房拆除改造施工要点

新乡旧车间改造翻新|河南老旧食品厂房拆除改造施工要点 近几年食品行业验收标准持续升级,很多投产多年的无尘车间、洁净厂房陆续出现墙板老化、密封失效、板缝发霉、洁净度不达标的问题。大量新乡本地食品企业,面临年审整改、产能升级、车间换…

2026/7/7 13:04:23 阅读更多 →
LV3296与STM32F722ZE嵌入式信号处理系统设计

LV3296与STM32F722ZE嵌入式信号处理系统设计

1. LV3296与STM32F722ZE的硬件协同架构解析在嵌入式信息处理系统中,LV3296作为一款高性能信号调理芯片,与STM32F722ZE微控制器的组合堪称黄金搭档。这套组合之所以能实现高效的信息捕获与跟踪,关键在于两者的硬件特性形成了完美互补。LV3296的…

2026/7/7 12:56:01 阅读更多 →

日新闻

鸿蒙新特性:图片画廊与轮播导航——构建沉浸式图片浏览体验

鸿蒙新特性:图片画廊与轮播导航——构建沉浸式图片浏览体验

图片浏览是移动应用中最高频的场景之一。从社交应用的照片流到电商平台的商品图集,从旅游应用的景点相册到摄影作品展示——用户对图片浏览的体验要求不断提高:流畅的切换动画、直观的缩略图导航、便捷的收藏操作、自动播放模式。HarmonyOS NEXT ArkUI 虽…

2026/7/7 0:05:16 阅读更多 →
24V DC-DC降压芯片PW2312B/PW2815,SOT23-6到SOP8-EP方案对比

24V DC-DC降压芯片PW2312B/PW2815,SOT23-6到SOP8-EP方案对比

24V稳压芯片完整选型指南 PW8600 PW75XX PW2815 PW2312B LDODC/DC全方案 一、24V稳压方案概述 24V直流电源在工业自动化、门禁系统、电梯控制、汽车电子、LED驱动、监控设备等场景中应用极广,是最常见的中压直流母线电压。要将24V母线稳定降压至下游MCU、传感器…

2026/7/7 0:05:16 阅读更多 →
RAG+知识图谱混合检索与Graph RAG核心对比

RAG+知识图谱混合检索与Graph RAG核心对比

做企业RAG落地的团队,往往容易卡在一容易踩坑的选型难题: 当需求单纯靠向量RAG搞不定、单纯靠知识图谱也搞不定,必须同时依赖「文本语义理解 实体关系推理」时,到底是做「向量图谱混合检索」就够了,还是必须上「Grap…

2026/7/7 0:07:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/7 12:34:47 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻