首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • a^x mod z = 1, 其中a,z是正整数,gcd(a,z)=1 ,最小的整数x(x〉0)怎么求? [已结贴,结贴人:keep_myself]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • keep_myself
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 揭帖率:
    发表于:2008-05-14 09:30:15 楼主
    一直想不明白,当然小数据枚举一下就出来了,现在 a,z范围很大,可以达到2^31-1,那么暴力就不行了,请问有什么好方法吗?
    20  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • gxqcn
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-14 10:29:381楼 得分:8
    由欧拉定理,a^φ(z) mod z = 1,
    所以 x|φ(z)

    1、计算出 φ(z)
    2、分解出 φ(z),得到其因子序列,并升序重排
    3、在该序列中试探,找到满足要求的最小者,即为 x

    实际操作时,可以不必排序,如果候选者大于当前的待定值即可跳过。
    这是我开发 HugeCalc 的里的算法流程,仅供参考。

    学术性数学网站;知识与趣味相交融;提供原创数学工具软件。  研讨数学的研究、发展及应用等问题,以及计算机(算法)在数学研发中的相互关系。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • dlyme
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 4

    发表于:2008-05-14 11:26:582楼 得分:6
    gxqcn是这方面的专家了,向你学习!

    专门去查了一下这个定理:
    欧拉函数是指:对于一个正整数n,小于n且和n互质的正整数的个数,记做:φ(n)
    欧拉定理:gcd(a, n) = 1,则a^φ(n) ≡ 1 mod n
    对于互质的整数a和n,有a^φ(n) ≡ 1 mod n
    证明:
        首先证明下面这个命题:
        对于集合Z = {X1,X2,...,Xφ(n)},Xi为第i个小于n且和n互质的正整数
        考虑集合
        S = {aX1 mod n,aX2 mod n,...,aXφ(n) mod n}
        则S = Z
        证明:
        a, n互质,Xi与n互质,那么aXi与n互质
        对于Z中两个元素Xi和Xj,如果Xi ≠ Xj
        则aXi mod n ≠ aXj mod n,若aXi mod n = aXj mod n,
        那么a(Xi - Xj) mod n  = 0, a, n互质那么Xi - Xj mod n = 0 由于    0 < Xi, Xj < n显然不可能。因此S中的元素各不相同,这样S中含有φ(n)个与n互    质的正整数,且满足每个元素小于n所以,很明显,S = Z            既然这样,那么
        (aX1 × aX2×...×aXφ(n))mod n
        = (aX1 mod n × aX2 mod n × ... × aXφ(n) mod n)mod n
        = (x1 × x2 × ... × xφ(n))mod n
        考虑上面等式左边和右边
        最左边等于(a^φ(n) × (x1 × x2 × ... × xφ(n)) mod n
        最右边等于(x1 × x2 × ... × xφ(n))mod n
        得到(a^φ(n) - 1)(x1 × x2 × ... × xφ(n)) mod n = 0
        而(x1 × x2 × ... × xφ(n))mod n 和 n互质,所以 a^φ(n) ≡ 1 mod n推论:当n为素数时,φ(n) = n - 1,  a^(n - 1) - 1 mod n = 0
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • mathe
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-14 12:22:483楼 得分:6
    还可以稍微改善一下算法的效率
    如果z=p1^a1p2^a2...pt^at
    那么φ(z)/z=(p1-1)/p1 (p2-1)/p2 ... (pt-1)/pt
    但是对于这个指数,在z是合数时,我们还可以用更小一点的数据开始
    记M=LCM((p1-1)p1^(a1-1), (p2-1)p2^(a2-1),...,(pt-1)^(at-1))
    也就是M是上面这些数的最小公倍数,那么就有
    a^M =1 (mod z)
    然后,对于M的每个素因子t,我们可以检查a^(M/t)模z是否为1,如果是,我们就找到一个更加小的指数M=M/t
    然后对新指数M重复上面的过程,知道对于M的所有素因子t,a^(M/t)模z都不是1,我们就找到了最小的指数M.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • gxqcn
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-14 13:24:494楼 得分:0
    mathe 的算法很好!

    考虑到 p1、p2、...、pt 均为素数,
    M = LCM(p1-1, p2-1, ..., pt-1) * p1^(a1-1)*p2^(a2-1)*...*pt^(at-1)
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • gxqcn
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-14 14:24:375楼 得分:0
    我上面的 M 有可能大于 mathe 定义的 M(虽然这并不影响算法的正确性),
    所以请沿用先前的。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • keep_myself
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-14 18:27:316楼 得分:0
    谢谢各位大牛,原来有这么多有用的定义,我都不知道,看样子该多看书...

    先给分
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved