List haskell列表理解(数论问题)

List haskell列表理解(数论问题),list,haskell,numbers,theory,list-comprehension,List,Haskell,Numbers,Theory,List Comprehension,我尝试在haskell中解决以下问题: 用(a^b)找到最小的数字b mod 100)=1,对于每一个带有 gcd(a,100)=1 我试过这个: head[ b | a <- [1..], b <- [1..], (a^b `mod` 100) == 1, gcd a 100 == 1] head[b | a这似乎是λ(x)的用法。它计算最小的指数m,比如am≡ 1 mod x表示所有a,使得gcd(a,x)=1成立。因为λ(100)=20,所以你要找的b是20 您可以使用以下未

我尝试在haskell中解决以下问题:

用(a^b)找到最小的数字b mod 100)=1,对于每一个带有 gcd(a,100)=1

我试过这个:

head[ b | a <- [1..], b <- [1..], (a^b `mod` 100) == 1, gcd a 100 == 1]

head[b | a这似乎是λ(x)的用法。它计算最小的指数m,比如am≡ 1 mod x表示所有a,使得gcd(a,x)=1成立。因为λ(100)=20,所以你要找的b是20

您可以使用以下未经测试的Haskell表达式计算所有模块的解决方案(上述公式中的x),这或多或少是Wikipedia文章中解释的方法的直接翻译:

import Data.Numbers.Primes

carmichael 1 = 1
carmichael 2 = 1
carmichael 4 = 2
carmichael n | isPowerOf 2 n    = n `div` 4
             | isPowerOf fac1 n = (n `div` fac1) * (fac1 - 1)
             | otherwise        = foldr1 lcm $ map (carmichael . product) grp
  where factors@(fac1:_) = primeFactors n
        grp              = group factors

isPowerOf n k | n == k         = True
              | k `mod` n == 0 = isPowerOf n (k `div` n)
              | otherwise      = False
“for every a”部分是一个无限集,所以你不应该期望用直接的蛮力解来解决这个问题。你需要更多的数论


无论如何,假设一个直接的解决方案是可能的,这里的问题是
据我所知,列表理解按与外观相反的顺序迭代每个绑定变量:

[ (x,y) | x <- [0,1], y <- [0,1] ] == [(0,0),(0,1),(1,0),(1,1)]
[ (x,y) | x <- [0,1], y <- [0..] ] == [(0,0),(0,1),(0,2),(0,3),(0,4),(0,5),...]
[ (x,y) | x <- [0..], y <- [0,1] ] == [(0,0),(0,1),(1,0),(1,1),(2,0),(2,1),...]

这个问题与第二个示例的问题类似。我不知道足够的数论来帮助您进一步找到有效的解决方案,但这是您实现的基本问题。

找到最小的数字b

find f [1..]
(a^b mod 100)=每a 1

f b = all (\a -> a^b `mod` 100 == 1) xs
[每a]有gcd(a,100)=1


其中xs=[a您计划如何显示gcd(a,100)中的每一个a都适用此选项=1,彻底搜索到无限?@pat:检查所有a@Fuz:是的,我在那里见过你:-)函数的
ispowerrof
名称或实现错误。它不会测试
k
是否是
n
的幂。@augustss:修复了它。在它被认为是
ispowerrof2
函数之前我在重写的过程中忘记了一个2。@jon_darkstar:这个模块来自于包
primes
。你可以使用cabal安装它。我会写第二行
(全部(=1)[mod a b|a@spore234:如果你知道怎么做,请确认这个答案是正确的。@spore234如果你喜欢一个答案,你可以点击向上箭头向上投票。(我认为这需要15个声誉,你现在已经有了)。要接受一个答案,你只需点击向上/向下箭头的复选标记。
find f [1..]
f b = all (\a -> a^b `mod` 100 == 1) xs
    where xs = [a <- [1..100], gcd a 100 == 1]