我是这个论坛的新手,并不太了解这个论坛的协议,所以请原谅我的无知.我的问题与spoj问题https://www.spoj.pl/problems/KPRIMES2/有关.我正在为这个问题获得超时限制.我认为这个程序的瓶颈正在产生10 ^ 9.可能有人建议如何改进这个筛子,更快的方式来生成素数或如何解决这个问题.这是我算法的草图
该程序生成2k + 1形式的所有素数,并将这些素数编码为数组a [i]的32位整数,其中未设置位代表primes.a [0]编码3,5,7 ....... 65 .a [1]编码67以后,依此类推.我有一个辅助数组bitcnt [],其中bitcnt [i]存储[0],[1],......... a [i]的未设置位的总和.我使用bitcnt进行二分搜索并找到第k个数字的位置.这里是函数的位解释.prime()函数生成素数,并且我将素数编码到数字[32位无符号整数]的位上.bitcnt数组存储数组a的未设置位的总和,用于二进制搜索目的.bsearchupper(int m)返回m lie的bitcnt索引.最后在main函数中,我存储了多少素数到m的上限并开始递减值直到我得到K.谢谢.
编辑:SPOJ的问题陈述
输入
一个整数,表示查询数Q(等于100000),Q行跟随,每个包含1到50000000之间的一个整数K(含).
产量
Q行与每个查询的答案:Kth素数.
例
输入:8 1 10 100 1000 10000 100000 1000000 10000000
产量:2 29 541 7919 104729 1299709 15485863 179424673
#include<cstdio>
#include<vector>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<ctime>
#define Lim 1000000000
using namespace std;
unsigned int a[(Lim>>6)+10],bitcnt[(Lim>>6)+10];
int bound;
void prime()
{
int p_1,q_1,p_2,q_2,Ub=sqrt(Lim*1.0);
for(int i=3;i<=Ub;i+=2)
{
p_1=(i-3)>>6,q_1=((i-3)>>1)&31;
if(!(a[p_1] & (1L<<q_1)))
for(int j=i*i;j<Lim;j+=i)
if(j&1)
{
p_2=(j-3)>>6,q_2=((j-3)>>1)&31;
a[p_2]|=(1L<<q_2);
} …Run Code Online (Sandbox Code Playgroud) 维基百科在每篇文章中提供了一个链接(打印/导出的左侧),以PDF格式下载文章.我写了一个小的Haskell脚本,它首先获取Wikipedia链接并输出渲染链接.当我将渲染网址作为输入时,我得到空标记但是浏览器中的相同网址提供了下载链接.
有人可以告诉我如何解决这个问题?ideone上的格式化代码.
import Network.HTTP
import Text.HTML.TagSoup
import Data.Maybe
parseHelp :: Tag String -> Maybe String
parseHelp ( TagOpen _ y ) = if any ( \( a , b ) -> b == "Download a PDF version of this wiki page" ) y
then Just $ "http://en.wikipedia.org" ++ snd ( y !! 0 )
else Nothing
parse :: [ Tag String ] -> Maybe String
parse [] = Nothing
parse ( x : xs )
| isTagOpen x …Run Code Online (Sandbox Code Playgroud) 我用par和编写了一个简单的并行矩阵乘法pseq.
运行此程序后,没有任何火花转换(火花:20(0转换,0修剪)).
我想听听你关于改进这个计划的意见.
还有关于在Haskell中学习并行编程的方法.
import Data.List
import Control.Parallel
parHelp :: ( Num a ) => [ a ] -> [ a ] -> a
parHelp [] [] = 0
parHelp ( x : xs ) ( y : ys ) = ret where
ret = par a ( pseq b ( a + b ) ) where
a = x * y
b = parHelp xs ys
helpMult :: ( Num a ) => [ a …Run Code Online (Sandbox Code Playgroud) 我试图在Haskell中解决这个问题,但是时间限制超过了.我应用了我所有的Haskell和数学技能来优化这一点,但都是徒劳的.有人可以建议我如何进一步优化此代码.序列F_3 + F_7 + F_11 .... + F_(4n + 3)= F_2n*F_(2n + 1).我使用O(log n)方法来计算斐波纳契数.
import Data.List
import Data.Maybe
import qualified Data.ByteString.Lazy.Char8 as BS
matmul :: [Integer] -> [Integer] -> Integer -> [Integer]
matmul [a,b,c] [d,e,f] m = [x,y,z] where
y = (a*e + b*f) `mod` m
z = (b*e + c*f) `mod` m
x = y + z
powM ::[Integer] -> Integer -> Integer -> [Integer]
powM a n m | n == 1 = a
| n …Run Code Online (Sandbox Code Playgroud) 我正在浏览这个剽窃探测器并试图在Haskell中编写一个程序,它将读取一个文件并用同义词替换它的一些单词.在Haskell有没有可用于此目的的字典?
此外,如果您有关于算法的任何输入或与此问题相关的任何其他输入,例如如何通过用同义词替换单词来避免更改语句的上下文,那么请发布它.
我是Haskell程序员(我通常在Haskell中实现算法)并试图理解HOOPL库但我无法解码它.我没有编译器背景(目前正在学习Coursera和编译器:原理,技术和工具),如果你能建议我采用系统的方式来理解HOOPL库(前提条件是什么),那将会很棒.假设我有一个小的Haskell代码,我想在其上使用HOOPL应用数据流优化
add :: Int -> Int -> Int
add x y = z where
x' = 1
y' = 1 -- this will be dead code elimination
z = x' + 1
Run Code Online (Sandbox Code Playgroud)
如何编写HOOPL代码来优化它.如果你能给出一些更好的例子并且原谅我,如果我听起来很愚蠢,那就太棒了.
有些人可以告诉我为什么这段代码没有编译.我试图使用ppx_deriving库打印抽象语法树.
type prog = command list
[@@deriving show]
and command =
| Incv | Decv
| Incp | Decp
| Input | Output
| Loop of command list
[@@deriving show]
let _ = Format.printf "%s" (show_prog ([Incv, Incv]))
hello:brainfuckinter mukeshtiwari$ ocamlbuild -package ppx_deriving.std ast.byte
+ /Users/mukeshtiwari/.opam/4.02.1/bin/ocamlc.opt -c -I /Users/mukeshtiwari/.opam/4.02.1/lib/ppx_deriving -o ast.cmo ast.ml
File "ast.ml", line 10, characters 28-37:
Error: Unbound value show_prog
Command exited with code 2.
Compilation unsuccessful after building 2 targets (1 cached) in 00:00:00.
hello:brainfuckinter mukeshtiwari$ ocaml …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用where子句编写椭圆曲线点加法.我收到编译器错误但是当我使用let in expression翻译相同的代码时,它工作正常.有人可以告诉我这段代码有什么问题.完整源代码[ http://hpaste.org/49174 ]
谢谢
Mukesh Tiwari
{--
--add points of elliptic curve using where clause getting compiler error
addPoints :: Elliptic -> Point -> Point -> Either Point Integer
addPoints _ Identity p_2 = Left p_2
addPoints _ p_1 Identity = Left p_1
addPoints ( Conelliptic a b n ) ( Conpoint x_p y_p ) ( Conpoint x_q y_q )
| x_p /= x_q = case ( ( Conpoint x_r y_r ) , d ) of
( _ …Run Code Online (Sandbox Code Playgroud)