haskell列表理解(数论问题)

| 我试图在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]
但这会得出1 ^ 1作为第一个解,这是不正确的,应该适用于每一个;例如,3 ^ 1不是解决方案。 我认为正确的解决方案是b = 20,但我希望在haskell中使用。     
已邀请:
找出最小的数b
find f [1..]
其中(a ^ b mod 100)= a
f b = all (\\a -> a^b `mod` 100 == 1) xs
[每个a]的gcd(a,100)= 1
    where xs = [a <- [1..100], gcd a 100 == 1]
    
这似乎是对Carmichael函数λ(x)的使用。它计算最小指数m,即对所有满足gcd(a,x)= 1的a等于1 mod mod x。因为λ(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 a \\”部分是一个无限集,因此,您不应期望直接使用蛮力解决方案来解决此问题。您在这里需要更多的数论。 无论如何,假设有可能直接解决,这里的问题是     a <-[...],b <-[...] 只是找到所有成对的a和b值,willy nilly。您需要进行一些订购才能获得所需的东西:
bs = [b | b <- [1..],
         (and [(a `mod` b)==1 | a <- [1..])
     ]
和函数在哪里返回列表中的所有元素是否为true。 (仍然无效,因为
a <- [1..]
是无限的,这意味着
and
会返回
False
或永远循环)。     
据我所知,列表推导会以出现的相反顺序迭代每个绑定变量:
[ (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),...]
在无限列表的情况下,这样会遇到问题。上面的第二个示例显示了无限列表中的一个变量将如何阻止另一个变量的更改,但是第三个示例显示了更改顺序可以解决此问题。 为了演示您当前的列表理解如何遍历
a
b
[ (a,b) | a <- [1..], b <- [1..] ] == [(1,1),(1,2),(1,3),(1,4),(1,5),(1,6),...]
此问题类似于第二个示例。我不知道足够多的数论来帮助您进一步提供有效的解决方案,但这是实现过程中的根本问题。     

要回复问题请先登录注册