psqrt.cal

来自「Calc Software Package for Number Calc」· CAL 代码 · 共 75 行

CAL
75
字号
/* * psqrt - calculate square roots modulo a prime * * Copyright (C) 1999  David I. Bell * * Calc is open software; you can redistribute it and/or modify it under * the terms of the version 2.1 of the GNU Lesser General Public License * as published by the Free Software Foundation. * * Calc is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU Lesser General * Public License for more details. * * A copy of version 2.1 of the GNU Lesser General Public License is * distributed with calc under the filename COPYING-LGPL.  You should have * received a copy with calc; if not, write to Free Software Foundation, Inc. * 59 Temple Place, Suite 330, Boston, MA  02111-1307, USA. * * @(#) $Revision: 29.2 $ * @(#) $Id: psqrt.cal,v 29.2 2000/06/07 14:02:25 chongo Exp $ * @(#) $Source: /usr/local/src/cmd/calc/cal/RCS/psqrt.cal,v $ * * Under source code control:	1990/02/15 01:50:35 * File existed as early as:	before 1990 * * Share and enjoy!  :-)	http://www.isthe.com/chongo/tech/comp/calc/ *//* * Returns null if number is not prime or if there is no square root. * The smaller square root is always returned. */define psqrt(u, p){	local	p1, q, n, y, r, v, w, t, k;	p1 = p - 1;	r = lowbit(p1);	q = p >> r;	t = 1 << (r - 1);	for (n = 2; ; n++) {		if (ptest(n, 1) == 0)			continue;		y = pmod(n, q, p);		k = pmod(y, t, p);		if (k == 1)			continue;		if (k != p1)			return;		break;	}	t = pmod(u, (q - 1) / 2, p);	v = (t * u) % p;	w = (t^2 * u) % p;	while (w != 1) {		k = 0;		t = w;		do {			k++;			t = t^2 % p;		} while (t != 1);		if (k == r)			return;		t = pmod(y, 1 << (r - k - 1), p);		y = t^2 % p;		v = (v * t) % p;		w = (w * y) % p;		r = k;	}	return min(v, p - v);}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?