[XSL-LIST Mailing List Archive Home]
[By Thread]
[By Date]
My entry: stylesheet and result below. timings on a PIII 730 (I really should get a new machine, my laptop is 4 times faster but isn't here:-) David Saxon 8.4 from Saxonica Java version 1.5.0_02 Stylesheet compilation time: 1552 milliseconds Calling template x : f3000: 6643904603669600722802178478660283842441635124527832594055797655426212141 61219257396449810982999820391132226802809465132446349331994409434926019045342 723 74918853031699467847355132063510109961938297318162258568733693978437352789755 548 94868417261317338143401291756224504216051010258971732359906627702037564387865 175 30547101123748849140252686120104032647025145598956675902135010566909783124959 436 46982555831428970135422715178460286571078062467510705656982282054284666032181 383 88962758197532813714918090044122191248563751216948117287242136678145773266185 214 78357661859018967313354840178403197559969056510791709859144173304364898001 1st (fermat base 2 pseudo-)prime: 72280217 : Execution time: 501 milliseconds Calling template x : f3000: 6643904603669600722802178478660283842441635124527832594055797655426212141 61219257396449810982999820391132226802809465132446349331994409434926019045342 723 74918853031699467847355132063510109961938297318162258568733693978437352789755 548 94868417261317338143401291756224504216051010258971732359906627702037564387865 175 30547101123748849140252686120104032647025145598956675902135010566909783124959 436 46982555831428970135422715178460286571078062467510705656982282054284666032181 383 88962758197532813714918090044122191248563751216948117287242136678145773266185 214 78357661859018967313354840178403197559969056510791709859144173304364898001 1st (fermat base 2 pseudo-)prime: 72280217 : Execution time: 180 milliseconds Calling template x : f3000: 6643904603669600722802178478660283842441635124527832594055797655426212141 61219257396449810982999820391132226802809465132446349331994409434926019045342 723 74918853031699467847355132063510109961938297318162258568733693978437352789755 548 94868417261317338143401291756224504216051010258971732359906627702037564387865 175 30547101123748849140252686120104032647025145598956675902135010566909783124959 436 46982555831428970135422715178460286571078062467510705656982282054284666032181 383 88962758197532813714918090044122191248563751216948117287242136678145773266185 214 78357661859018967313354840178403197559969056510791709859144173304364898001 1st (fermat base 2 pseudo-)prime: 72280217 : Execution time: 180 milliseconds <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:x="data:,x"> <xsl:output method="text"/> <xsl:function name="x:power_mod" as="xs:integer"> <xsl:param name="b" as="xs:integer"/> <xsl:param name="e" as="xs:integer"/> <xsl:param name="n" as="xs:integer"/> <xsl:choose> <xsl:when test="$e=0"> <xsl:sequence select="1"/> </xsl:when> <xsl:when test="$e=1"> <xsl:sequence select="$b"/> </xsl:when> <xsl:when test="$e>1 and ($e mod 2 = 1)"> <xsl:variable name="e2" select="x:power_mod($b,$e idiv 2,$n)"/> <xsl:sequence select="($e2 * $e2 * $b) mod $n"/> </xsl:when> <xsl:when test="$e>1"> <xsl:variable name="e2" select="x:power_mod($b,$e idiv 2,$n)"/> <xsl:sequence select="($e2 * $e2) mod $n"/> </xsl:when> </xsl:choose> </xsl:function> <xsl:function name="x:fib" as="xs:integer"> <xsl:param name="n" as="xs:integer"/> <xsl:choose> <xsl:when test="$n=0"> <xsl:sequence select="1"/> </xsl:when> <xsl:when test="$n =1"> <xsl:sequence select="1"/> </xsl:when> <xsl:when test="$n mod 2 = 0"> <xsl:variable name="n2" select="$n idiv 2"/> <xsl:variable name="fn" select="x:fib($n2)"/> <xsl:variable name="fn-1" select="x:fib($n2 -1)"/> <xsl:sequence select="$fn * $fn + $fn-1 * $fn-1"/> </xsl:when> <xsl:when test="$n mod 2 = 1"> <xsl:variable name="n2" select="($n - 1) idiv 2"/> <xsl:variable name="fn" select="x:fib($n2)"/> <xsl:variable name="fn-1" select="x:fib($n2 -1)"/> <xsl:sequence select="(2 * $fn-1 + $fn) * $fn"/> </xsl:when> </xsl:choose> </xsl:function> <xsl:template name="x"> : <xsl:variable name="x" select="string(x:fib(3000))"/> f3000: <xsl:value-of select="$x"/> 1st (fermat base 2 pseudo-)prime: <xsl:value-of select="(for $i in 1 to (string-length($x)-9) return xs:integer(substring($x,$i,10)))[x:power_mod(2,. - 1, .)=1][1]" separator=" "/> : </xsl:template> </xsl:stylesheet> ----------------------------------------------------------------------------- ------------------ Dimitre Novatchev's solution: <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:saxon="http://saxon.sf.net/" xmlns:f="http://fxsl.sf.net/" exclude-result-prefixes="xs saxon f" > <xsl:import href="../f/func-Fibonacci.xsl"/> <xsl:import href="../f/func-Primes.xsl"/> <xsl:output method="text"/> <!-- Solves the following problem: Find the first 10-digit prime in consecutive digits of F-3000 Where F-N is the Nth Fibonacci number. Here are the elements of the sequence of Fibonacci numbers from 0 to 11: Element: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144 Index: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 Invoke on any xml file or with an initial template named "initial". Expected result: 0072280217 --> <xsl:variable name="vFib" select="xs:string(f:fibo(3000))"/> <xsl:template name="initial" match="/"> The first prime from a sequence of ten consecutive digits in Fibonacci's number F3000: <xsl:text/> <xsl:value-of select="$vFib"/> Is: <xsl:text/> <xsl:value-of select= "( for $n in 1 to string-length($vFib)-9 return(substring($vFib, $n, 10)) ) [f:isPrime(xs:integer(.))][1] "/> </xsl:template> </xsl:stylesheet> file: ../f/func-Fibonacci.xsl ==================== <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:saxon="http://saxon.sf.net/" xmlns:f="http://fxsl.sf.net/" exclude-result-prefixes="f xs saxon" > <xsl:function name="f:fiboLimitedSeq" as="xs:integer*"> <xsl:param name="pLimit" as="xs:double"/> <xsl:param name="pN" as="xs:integer"/> <xsl:variable name="vVal" select="f:fibo($pN)"/> <xsl:if test="$vVal le $pLimit" > <xsl:sequence select= "$vVal, f:fiboLimitedSeq($pLimit, $pN+1)" /> </xsl:if> </xsl:function> <xsl:function name="f:fibo" as="xs:integer" > <xsl:param name="pN" as="xs:integer"/> <xsl:sequence select= "if ($pN gt 10) then if($pN mod 2 = 0) then for $i in $pN idiv 2, $fi in f:fibo($i), $fi-1 in f:fibo($i -1) return $fi*$fi + $fi-1*$fi-1 else for $i in ($pN -1) idiv 2, $fi in f:fibo($i), $fi-1 in f:fibo($i -1) return (2*$fi-1 + $fi) * $fi else (1,1,2,3,5,8,13,21,34,55,89)[$pN +1] "/> </xsl:function> </xsl:stylesheet> file ../f/func-Primes.xsl ================= <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:saxon="http://saxon.sf.net/" xmlns:gexslt="http://www.gobosoft.com/eiffel/gobo/gexslt/extension" xmlns:f="http://fxsl.sf.net/" exclude-result-prefixes="xs saxon f" > <xsl:import href="func-sqrt.xsl"/> <xsl:output method="text"/> <xsl:function name="f:isPrime" as="xs:boolean" saxon:memo-function="yes" gexslt:memo-function="yes"> <xsl:param name="pNum" /> <xsl:variable name="vstrNum" select="string($pNum)" as="xs:string"/> <xsl:variable name="vLastDigit" select="substring($vstrNum, string-length($vstrNum))"/> <xsl:value-of select= "if(not(translate($vLastDigit, '024568', '')) ) then false() else if(f:pow2mod($pNum - 1, $pNum) ne 1) then false() else empty( (3, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, (43 to xs:integer(round(f:sqrt($pNum, 0.1E0)))) ) [f:divisor(., $pNum)] ) "/> </xsl:function> <!-- f:pow2mod(K, N) = 2^K mod N --> <xsl:function name="f:pow2mod" as="xs:integer"> <xsl:param name="pE" as="xs:integer"/> <xsl:param name="pN" as="xs:integer"/> <xsl:sequence select= "if($pE eq 1) then 2 else for $half in f:pow2mod($pE idiv 2, $pN) return $half * $half * (1 + ($pE mod 2)) mod $pN "/> </xsl:function> </xsl:stylesheet> Timings on my 2-year old P-IV 3GHZ 2GB PC run with Saxon 8.6.1: Execution time: 235 ms Result: The first prime from a sequence of ten consecutive digits in Fibonacci's number F3000: 66439046036696007228021784786602838424416351245278325940557976554262121416121 92573964498109829998203911322268028094651324463493319944094349260190453427237 49188530316994678473551320635101099619382973181622585687336939784373527897555 48948684172613173381434012917562245042160510102589717323599066277020375643878 65175305471011237488491402526861201040326470251455989566759021350105669097831 24959436469825558314289701354227151784602865710780624675107056569822820542846 66032181383889627581975328137149180900441221912485637512169481172872421366781 45773266185214783576618590189673133548401784031975599690565107917098591441733 04364898001 Is: 0072280217 -- Cheers, Dimitre Novatchev --------------------------------------- To avoid situations in which you might make mistakes may be the biggest mistake of all.
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
[xsl] Pagebreaks in Excel-HTML tran, Oleg Konovalov | Thread | [no subject], Unknown |
[xsl] Pagebreaks in Excel-HTML tran, Oleg Konovalov | Date | [no subject], Unknown |
Month |
Keywords