标签: modular-arithmetic

为什么λ演算最优评估器能够在没有公式的情况下计算大的模幂运算?

教会号码是自然数字作为函数的编码.

(\ f x ? (f x))             -- church number 1
(\ f x ? (f (f (f x))))     -- church number 3
(\ f x ? (f (f (f (f x))))) -- church number 4
Run Code Online (Sandbox Code Playgroud)

整齐地说,你可以通过应用它们来取代2个教会数字.也就是说,如果你申请4到2,你就得到教会号码16,或者2^4.显然,这完全是不切实际的.教会数字需要一定数量的记忆,而且非常非常慢.像10^10GHCI快速正确回答的类似计算的东西需要很长时间,无论如何都无法适应你计算机上的内存.

我最近一直在尝试最佳的λ评估员.在我的测试中,我不小心在我的最佳λ计算器上键入了以下内容:

10 ^ 10 % 13
Run Code Online (Sandbox Code Playgroud)

它应该是乘法,而不是取幂.在我绝望地移动我的手指中止永久运行的程序之前,它回答了我的要求:

3
{ iterations: 11523, applications: 5748, used_memory: 27729 }

real    0m0.104s
user    0m0.086s
sys     0m0.019s
Run Code Online (Sandbox Code Playgroud)

随着我的"错误警报"闪烁,我去谷歌并确认了10^10%13 == 3.但是λ计算器不应该找到那个结果,它几乎不能存储10 ^ 10.对于科学,我开始强调它.这立刻回答我20^20%13 == 3,50^50%13 == …

algorithm haskell functional-programming lambda-calculus modular-arithmetic

130
推荐指数
2
解决办法
4951
查看次数

模运算符比手动实现慢?

我发现手动计算%运算符__int128比内置的编译器运算符要快得多。我将向您展示如何计算模 9,但该方法可用于计算模任何其他数字。

首先,考虑内置编译器操作符:

uint64_t mod9_v1(unsigned __int128 n)
{
    return n % 9;
}
Run Code Online (Sandbox Code Playgroud)

现在考虑我的手动实现:

uint64_t mod9_v2(unsigned __int128 n)
{
    uint64_t r = 0;

    r += (uint32_t)(n);
    r += (uint32_t)(n >> 32) * (uint64_t)4;
    r += (uint32_t)(n >> 64) * (uint64_t)7;
    r += (uint32_t)(n >> 96);

    return r % 9;
}
Run Code Online (Sandbox Code Playgroud)

测量超过 100,000,000 个随机数给出以下结果:

mod9_v1 | 3.986052 secs
mod9_v2 | 1.814339 secs
Run Code Online (Sandbox Code Playgroud)

GCC 9.3.0 with-march=native -O3用于 AMD Ryzen Threadripper 2990WX。 是godbolt的链接。

我想问一下它在你这边的行为是否相同?(在向 GCC Bugzilla …

c x86-64 compiler-optimization 128-bit modular-arithmetic

23
推荐指数
1
解决办法
4462
查看次数

获取5 ^ 1234566789893943的最后1000位数字

我在一些在线论坛上看到了以下面试问题.对此有什么好的解决方案?

获取5 ^ 1234566789893943的最后1000位数字

algorithm biginteger modular-arithmetic

13
推荐指数
2
解决办法
626
查看次数

Modular arithmetics and NTT (finite field DFT) optimizations

I wanted to use NTT for fast squaring (see Fast bignum square computation), but the result is slow even for really big numbers .. more than 12000 bits.

So my question is:

  1. Is there a way to optimize my NTT transform? I did not mean to speed it by parallelism (threads); this is low-level layer only.
  2. Is there a way to speed up my modular arithmetics?

This is my (already optimized) source code in C++ for NTT (it's complete …

c++ optimization performance modular-arithmetic ntt

10
推荐指数
1
解决办法
2804
查看次数

在模运算中确定数字是否在两个数之间的算法

我正在尝试编写一个回答问题的函数:如果你开始计数a并停止计数b,则c在该范围内(也就是c介于a和之间b).

通常a < c && c < b就足够了,但我是模块化算法:

(框图)

逆时针正在增加.

绿色:是c的值,其中算法应指示true(其中c在a和b之间)

蓝色:是c的值,其中算法应该指示false(其中c不在a和b之间)(这恰好与c在b和a之间的位置相同)

简单的a < c && c < b失败的范围ab超过0 的范围.

例如,假设A = 300和B = 45.如果C是10,则该函数将返回真:300,301,302 ... 359,0,1,2,3 ... 8,9,10,11 ,12 ... 43,44,45.因此,在360中,10在300和45之间.

最终,我想要确定的是一个色调是否在两个其他色调之间,其中色调是以色轮周围的度数指定的(这是一个mod 360系统).如果答案是以mod为单位的话会很好,所以它会解决一般情况而不是特定于我的问题.

language-agnostic algorithm modular-arithmetic

9
推荐指数
1
解决办法
1271
查看次数

Javascript模块化算术

Javascript将以下代码片段评估为-1.

-5 % 4

我知道余数定理表明a = bq + r使得0≤r<b.鉴于上面的定义,答案不应该是3?为什么JavaScript返回-1?

javascript modular-arithmetic

7
推荐指数
2
解决办法
2432
查看次数

在JavaScript中计算模块化逆

我试图采用ed = 1 mod((p-1)(q-1))并求解d,就像RSA算法一样.

e = 5,(p-1)*(q-1)= 249996

我在javascript中尝试了很多代码,例如:

function modInverse(){
var e = 5;
var p = 499;
var q = 503;
var d = e.modInverse((p-1) * (q-1));
DisplayResult(d, "privateKeyResultLabel")
}
Run Code Online (Sandbox Code Playgroud)

要么

function modInverse(){ 
System.out.println(BigInteger.valueOf(5).modInverse(BigInteger.valueOf(249996)));
}
Run Code Online (Sandbox Code Playgroud)

我只是无法弄清楚正确的方法来解决d,模块化逆,在javascript中.

javascript algorithm rsa inverse modular-arithmetic

7
推荐指数
2
解决办法
3307
查看次数

Sympy:在有限域中求解矩阵

对于我的项目,我需要求矩阵X给定矩阵Y和K.(XY = K)每个矩阵的元素必须是以随机256位素数为模的整数.我解决这个问题的第一次尝试使用了SymPy的mod_inv(n)功能.这个问题是我的内存耗尽了大约30的矩阵.我的下一个想法是执行矩阵分解,因为它可能对内存不太重.但是,SymPy似乎不包含可以找到模数的矩阵的求解器.我可以使用任何变通办法或自制代码吗?

python matrix sympy matrix-factorization modular-arithmetic

7
推荐指数
1
解决办法
1828
查看次数

Haskell中的模块化方程

我想在一个变量中解决Haskell中的线性和二次模块方程.我现在这样做的方法是逐个x = [1..]输入等式并找到余数(expr `rem` p == 0如果等式是模p(不一定是素数),expr那么变量就是x).我相信这是一个非常低效的过程.那么还有更好的方法吗?

haskell equation-solving modular-arithmetic

7
推荐指数
1
解决办法
323
查看次数

模块化算术 - 竞争性编程

我看到很多有竞争力的程序员用((a + b) % d + d) % dC++ 编写代码.他们为什么不使用(a + b) % d+ d括号里面有什么用?它与负数有关吗?

谢谢

c++ math modular-arithmetic

6
推荐指数
1
解决办法
537
查看次数