def __call__(self, assumptions=None): """ Run 'command' and collect output. INPUT: - ``assumptions`` - ignored, accepted for compatibility with other solvers (default: ``None``) TESTS: This class is not meant to be called directly:: sage: from sage.sat.solvers.dimacs import DIMACS sage: fn = tmp_filename() sage: solver = DIMACS(filename=fn) sage: solver.add_clause( (1, -2 , 3) ) sage: solver() Traceback (most recent call last): ... ValueError: No SAT solver command selected. """ if assumptions is not None: raise NotImplementedError("Assumptions are not supported for DIMACS based solvers.") self.write() output_filename = None self._output = [] command = self._command.strip() if not command: raise ValueError("No SAT solver command selected.") if "{output}" in command: output_filename = tmp_filename() command = command.format(input=self._headname, output=output_filename) args = shlex.split(command) try: process = subprocess.Popen(args, stdout=subprocess.PIPE) except OSError: raise OSError("Could run '%s', perhaps you need to add your SAT solver to $PATH?"%(" ".join(args))) try: while process.poll() is None: for line in iter(process.stdout.readline,''): if get_verbose() or self._verbosity: print line, sys.stdout.flush() self._output.append(line) sleep(0.1) if output_filename: self._output.extend(open(output_filename).readlines()) except BaseException: process.kill() raise
def __call__(self, assumptions=None): """ Run 'command' and collect output. INPUT: - ``assumptions`` - ignored, accepted for compatibility with other solvers (default: ``None``) TESTS: This class is not meant to be called directly:: sage: from sage.sat.solvers.dimacs import DIMACS sage: fn = tmp_filename() sage: solver = DIMACS(filename=fn) sage: solver.add_clause( (1, -2 , 3) ) sage: solver() Traceback (most recent call last): ... ValueError: No SAT solver command selected. """ if assumptions is not None: raise NotImplementedError("Assumptions are not supported for DIMACS based solvers.") self.write() output_filename = None self._output = [] command = self._command.strip() if not command: raise ValueError("No SAT solver command selected.") if "{output}" in command: output_filename = tmp_filename() command = command.format(input=self._headname, output=output_filename) args = shlex.split(command) try: process = subprocess.Popen(args, stdout=subprocess.PIPE) except OSError: raise OSError("Could run '%s', perhaps you need to add your SAT solver to $PATH?"%(" ".join(args))) try: while process.poll() is None: for line in iter(process.stdout.readline,''): if get_verbose() or self._verbosity: print(line) sys.stdout.flush() self._output.append(line) sleep(0.1) if output_filename: self._output.extend(open(output_filename).readlines()) except BaseException: process.kill() raise
def series(self, n=2, quadratic_twist=+1, prec=5): r""" Returns the `n`-th approximation to the `p`-adic L-series as a power series in `T` (corresponding to `\gamma-1` with `\gamma=1+p` as a generator of `1+p\ZZ_p`). Each coefficient is a `p`-adic number whose precision is provably correct. Here the normalization of the `p`-adic L-series is chosen such that `L_p(J,1) = (1-1/\alpha)^2 L(J,1)/\Omega_J` where `\alpha` is the unit root INPUT: - ``n`` - (default: 2) a positive integer - ``quadratic_twist`` - (default: +1) a fundamental discriminant of a quadratic field, coprime to the conductor of the curve - ``prec`` - (default: 5) maximal number of terms of the series to compute; to compute as many as possible just give a very large number for ``prec``; the result will still be correct. ALIAS: power_series is identical to series. EXAMPLES:: sage: J = J0(188)[0] sage: p = 7 sage: L = J.padic_lseries(p) sage: L.is_ordinary() True sage: f = L.series(2) sage: f[0] O(7^20) sage: f[1].norm() 3 + 4*7 + 3*7^2 + 6*7^3 + 5*7^4 + 5*7^5 + 6*7^6 + 4*7^7 + 5*7^8 + 7^10 + 5*7^11 + 4*7^13 + 4*7^14 + 5*7^15 + 2*7^16 + 5*7^17 + 7^18 + 7^19 + O(7^20) """ n = ZZ(n) if n < 1: raise ValueError("n (={0}) must be a positive integer".format(n)) if not self.is_ordinary(): raise ValueError("p (={0}) must be an ordinary prime".format( self._p)) # check if the conditions on quadratic_twist are satisfied D = ZZ(quadratic_twist) if D != 1: if D % 4 == 0: d = D // 4 if not d.is_squarefree() or d % 4 == 1: raise ValueError( "quadratic_twist (={0}) must be a fundamental discriminant of a quadratic field" .format(D)) else: if not D.is_squarefree() or D % 4 != 1: raise ValueError( "quadratic_twist (={0}) must be a fundamental discriminant of a quadratic field" .format(D)) if gcd(D, self._p) != 1: raise ValueError( "quadratic twist (={0}) must be coprime to p (={1}) ". format(D, self._p)) if gcd(D, self._E.conductor()) != 1: for ell in prime_divisors(D): if valuation(self._E.conductor(), ell) > valuation(D, ell): raise ValueError( "can not twist a curve of conductor (={0}) by the quadratic twist (={1})." .format(self._E.conductor(), D)) p = self._p if p == 2 and self._normalize: print('Warning : For p=2 the normalization might not be correct !') #verbose("computing L-series for p=%s, n=%s, and prec=%s"%(p,n,prec)) # bounds = self._prec_bounds(n,prec) # padic_prec = max(bounds[1:]) + 5 padic_prec = 10 # verbose("using p-adic precision of %s"%padic_prec) res_series_prec = min(p**(n - 1), prec) verbose("using series precision of %s" % res_series_prec) ans = self._get_series_from_cache(n, res_series_prec, D) if not ans is None: verbose("found series in cache") return ans K = QQ gamma = K(1 + p) R = PowerSeriesRing(K, 'T', res_series_prec) T = R(R.gen(), res_series_prec) #L = R(0) one_plus_T_factor = R(1) gamma_power = K(1) teich = self.teichmuller(padic_prec) p_power = p**(n - 1) # F = Qp(p,padic_prec) verbose("Now iterating over %s summands" % ((p - 1) * p_power)) verbose_level = get_verbose() count_verb = 0 alphas = self.alpha() #print len(alphas) Lprod = [] self._emb = 0 if len(alphas) == 2: split = True else: split = False for alpha in alphas: L = R(0) self._emb = self._emb + 1 for j in range(p_power): s = K(0) if verbose_level >= 2 and j / p_power * 100 > count_verb + 3: verbose("%.2f percent done" % (float(j) / p_power * 100)) count_verb += 3 for a in range(1, p): if split: b = (teich[a]) % ZZ(p**n) b = b * gamma_power else: b = teich[a] * gamma_power s += self.measure(b, n, padic_prec, D, alpha) L += s * one_plus_T_factor one_plus_T_factor *= 1 + T gamma_power *= gamma Lprod = Lprod + [L] if len(Lprod) == 1: return Lprod[0] else: return Lprod[0] * Lprod[1]
def series(self, n=2, quadratic_twist=+1, prec=5): r""" Returns the `n`-th approximation to the `p`-adic L-series as a power series in `T` (corresponding to `\gamma-1` with `\gamma=1+p` as a generator of `1+p\ZZ_p`). Each coefficient is a `p`-adic number whose precision is provably correct. Here the normalization of the `p`-adic L-series is chosen such that `L_p(J,1) = (1-1/\alpha)^2 L(J,1)/\Omega_J` where `\alpha` is the unit root INPUT: - ``n`` - (default: 2) a positive integer - ``quadratic_twist`` - (default: +1) a fundamental discriminant of a quadratic field, coprime to the conductor of the curve - ``prec`` - (default: 5) maximal number of terms of the series to compute; to compute as many as possible just give a very large number for ``prec``; the result will still be correct. ALIAS: power_series is identical to series. EXAMPLES: sage: J = J0(188)[0] sage: p = 7 sage: L = J.padic_lseries(p) sage: L.is_ordinary() True sage: f = L.series(2) sage: f[0] O(7^20) sage: f[1].norm() 3 + 4*7 + 3*7^2 + 6*7^3 + 5*7^4 + 5*7^5 + 6*7^6 + 4*7^7 + 5*7^8 + 7^10 + 5*7^11 + 4*7^13 + 4*7^14 + 5*7^15 + 2*7^16 + 5*7^17 + 7^18 + 7^19 + O(7^20) """ n = ZZ(n) if n < 1: raise ValueError, "n (=%s) must be a positive integer"%n if not self.is_ordinary(): raise ValueError, "p (=%s) must be an ordinary prime"%p # check if the conditions on quadratic_twist are satisfied D = ZZ(quadratic_twist) if D != 1: if D % 4 == 0: d = D//4 if not d.is_squarefree() or d % 4 == 1: raise ValueError, "quadratic_twist (=%s) must be a fundamental discriminant of a quadratic field"%D else: if not D.is_squarefree() or D % 4 != 1: raise ValueError, "quadratic_twist (=%s) must be a fundamental discriminant of a quadratic field"%D if gcd(D,self._p) != 1: raise ValueError, "quadratic twist (=%s) must be coprime to p (=%s) "%(D,self._p) if gcd(D,self._E.conductor())!= 1: for ell in prime_divisors(D): if valuation(self._E.conductor(),ell) > valuation(D,ell) : raise ValueError, "can not twist a curve of conductor (=%s) by the quadratic twist (=%s)."%(self._E.conductor(),D) p = self._p if p == 2 and self._normalize : print 'Warning : For p=2 the normalization might not be correct !' #verbose("computing L-series for p=%s, n=%s, and prec=%s"%(p,n,prec)) # bounds = self._prec_bounds(n,prec) # padic_prec = max(bounds[1:]) + 5 padic_prec = 10 # verbose("using p-adic precision of %s"%padic_prec) res_series_prec = min(p**(n-1), prec) verbose("using series precision of %s"%res_series_prec) ans = self._get_series_from_cache(n, res_series_prec,D) if not ans is None: verbose("found series in cache") return ans K = QQ gamma = K(1 + p) R = PowerSeriesRing(K,'T',res_series_prec) T = R(R.gen(),res_series_prec ) #L = R(0) one_plus_T_factor = R(1) gamma_power = K(1) teich = self.teichmuller(padic_prec) p_power = p**(n-1) # F = Qp(p,padic_prec) verbose("Now iterating over %s summands"%((p-1)*p_power)) verbose_level = get_verbose() count_verb = 0 alphas = self.alpha() #print len(alphas) Lprod = [] self._emb = 0 if len(alphas) == 2: split = True else: split = False for alpha in alphas: L = R(0) self._emb = self._emb + 1 for j in range(p_power): s = K(0) if verbose_level >= 2 and j/p_power*100 > count_verb + 3: verbose("%.2f percent done"%(float(j)/p_power*100)) count_verb += 3 for a in range(1,p): if split: # b = ((F.teichmuller(a)).lift() % ZZ(p**n)) b = (teich[a]) % ZZ(p**n) b = b*gamma_power else: b = teich[a] * gamma_power s += self.measure(b, n, padic_prec,D,alpha) L += s * one_plus_T_factor one_plus_T_factor *= 1+T gamma_power *= gamma Lprod = Lprod + [L] if len(Lprod)==1: return Lprod[0] else: return Lprod[0]*Lprod[1]