<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja">
	<id>https://ja.xen.wiki/index.php?action=history&amp;feed=atom&amp;title=%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%3ALimits</id>
	<title>モジュール:Limits - 版の履歴</title>
	<link rel="self" type="application/atom+xml" href="https://ja.xen.wiki/index.php?action=history&amp;feed=atom&amp;title=%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%3ALimits"/>
	<link rel="alternate" type="text/html" href="https://ja.xen.wiki/index.php?title=%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB:Limits&amp;action=history"/>
	<updated>2026-06-06T00:46:42Z</updated>
	<subtitle>このウィキのこのページに関する変更履歴</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>https://ja.xen.wiki/index.php?title=%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB:Limits&amp;diff=162&amp;oldid=prev</id>
		<title>R-4981: ページの作成:「local rat = require(&quot;Module:Rational&quot;) local ET = require(&quot;Module:ET&quot;) local p = {}  -- compute all positive ratios n/m with n and m &lt;= q modulo powers of equave -- previ…」</title>
		<link rel="alternate" type="text/html" href="https://ja.xen.wiki/index.php?title=%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB:Limits&amp;diff=162&amp;oldid=prev"/>
		<updated>2024-07-04T01:33:42Z</updated>

		<summary type="html">&lt;p&gt;ページの作成:「local rat = require(&amp;quot;Module:Rational&amp;quot;) local ET = require(&amp;quot;Module:ET&amp;quot;) local p = {}  -- compute all positive ratios n/m with n and m &amp;lt;= q modulo powers of equave -- previ…」&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新規ページ&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local rat = require(&amp;quot;Module:Rational&amp;quot;)&lt;br /&gt;
local ET = require(&amp;quot;Module:ET&amp;quot;)&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
-- compute all positive ratios n/m with n and m &amp;lt;= q modulo powers of equave&lt;br /&gt;
-- previous: already computed ratios for q-1&lt;br /&gt;
function p.limit_modulo_equave(q, equave, previous)&lt;br /&gt;
	equave = equave or 2&lt;br /&gt;
	local ratios = {}&lt;br /&gt;
	if previous then&lt;br /&gt;
		for n = 1, q do&lt;br /&gt;
			local a = rat.new(n, q)&lt;br /&gt;
			a = rat.modulo_mul(a, equave)&lt;br /&gt;
			local a_key = rat.as_ratio(a)&lt;br /&gt;
&lt;br /&gt;
			local b = rat.new(q, n)&lt;br /&gt;
			b = rat.modulo_mul(b, equave)&lt;br /&gt;
			local b_key = rat.as_ratio(b)&lt;br /&gt;
&lt;br /&gt;
			if previous[a_key] == nil then&lt;br /&gt;
				ratios[a_key] = a&lt;br /&gt;
			end&lt;br /&gt;
			if previous[b_key] == nil then&lt;br /&gt;
				ratios[b_key] = b&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		for n = 1, q do&lt;br /&gt;
			for m = 1, q do&lt;br /&gt;
				local a = rat.new(n, m)&lt;br /&gt;
				a = rat.modulo_mul(a, equave)&lt;br /&gt;
				local key = rat.as_ratio(a)&lt;br /&gt;
				ratios[key] = a&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return ratios&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- compute q-integer limit&lt;br /&gt;
-- if a function `norm` and a number `max_norm` are provided, the output will be additionally restricted&lt;br /&gt;
function p.integer_limit(q, norm, max_norm)&lt;br /&gt;
	local check_norm = type(norm) == &amp;quot;function&amp;quot; and type(max_norm) == &amp;quot;number&amp;quot;&lt;br /&gt;
	local ratios = {}&lt;br /&gt;
	for n = 1, q do&lt;br /&gt;
		for m = 1, q do&lt;br /&gt;
			local a = rat.new(n, m)&lt;br /&gt;
			if not check_norm or norm(a) &amp;lt;= max_norm then&lt;br /&gt;
				local key = rat.as_ratio(a)&lt;br /&gt;
				ratios[key] = a&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return ratios&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- check additive consistency for a set of ratios (modulo powers of equave):&lt;br /&gt;
--   approx(a*b) = approx(a) + approx(b) forall a, b: a, b, ab in ratios&lt;br /&gt;
-- `distinct`: whether distinct ratios are required to be mapped to distinct approximations&lt;br /&gt;
-- `previous`: already computed ratios for the previous iteraton&lt;br /&gt;
function p.additively_consistent(et, ratios, distinct, previous)&lt;br /&gt;
	distinct = distinct or false&lt;br /&gt;
	previous = previous or {}&lt;br /&gt;
	if distinct then&lt;br /&gt;
		local approx_set = {}&lt;br /&gt;
		for a_key, a in pairs(previous) do&lt;br /&gt;
			local a_approx = ET.approximate(et, rat.as_float(a)) % et.size&lt;br /&gt;
			if approx_set[a_approx] then&lt;br /&gt;
				if not rat.eq(rat.modulo_mul(rat.div(a, approx_set[a_approx]), et.equave), 1) then&lt;br /&gt;
					mw.log(a_key .. &amp;quot; -&amp;gt; &amp;quot; .. a_approx .. &amp;quot;: conflict!&amp;quot;)&lt;br /&gt;
					return false&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			approx_set[a_approx] = a&lt;br /&gt;
			mw.log(a_key .. &amp;quot; -&amp;gt; &amp;quot; .. a_approx)&lt;br /&gt;
		end&lt;br /&gt;
		for a_key, a in pairs(ratios) do&lt;br /&gt;
			local a_approx = ET.approximate(et, rat.as_float(a)) % et.size&lt;br /&gt;
			if approx_set[a_approx] then&lt;br /&gt;
				if not rat.eq(rat.modulo_mul(rat.div(a, approx_set[a_approx]), et.equave), 1) then&lt;br /&gt;
					mw.log(a_key .. &amp;quot; -&amp;gt; &amp;quot; .. a_approx .. &amp;quot;: conflict!&amp;quot;)&lt;br /&gt;
					return false&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			approx_set[a_approx] = a&lt;br /&gt;
			mw.log(a_key .. &amp;quot; -&amp;gt; &amp;quot; .. a_approx)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if type(distinct) == &amp;quot;number&amp;quot; then&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	local previous_ordered = {}&lt;br /&gt;
	for _, a in pairs(previous) do&lt;br /&gt;
		table.insert(previous_ordered, a)&lt;br /&gt;
	end&lt;br /&gt;
	local ratios_ordered = {}&lt;br /&gt;
	for _, a in pairs(ratios) do&lt;br /&gt;
		table.insert(ratios_ordered, a)&lt;br /&gt;
	end&lt;br /&gt;
	for i, a in ipairs(ratios_ordered) do&lt;br /&gt;
		local a_approx = ET.approximate(et, rat.as_float(a))&lt;br /&gt;
		for _, b in ipairs(previous_ordered) do&lt;br /&gt;
			local b_approx = ET.approximate(et, rat.as_float(b))&lt;br /&gt;
&lt;br /&gt;
			local c = rat.mul(a, b)&lt;br /&gt;
			local c_approx = ET.approximate(et, rat.as_float(c))&lt;br /&gt;
&lt;br /&gt;
			c = rat.modulo_mul(c, et.equave)&lt;br /&gt;
			local c_key = rat.as_ratio(c)&lt;br /&gt;
			if previous[c_key] or ratios[c_key] then&lt;br /&gt;
				if c_approx ~= a_approx + b_approx then&lt;br /&gt;
					mw.log(&amp;quot;a = &amp;quot; .. rat.as_ratio(a) .. &amp;quot;; b = &amp;quot; .. rat.as_ratio(b) .. &amp;quot;; ab = &amp;quot; .. c_key)&lt;br /&gt;
					mw.log(a_approx .. &amp;quot; + &amp;quot; .. b_approx .. &amp;quot; != &amp;quot; .. c_approx)&lt;br /&gt;
					return false&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		for j, b in ipairs(ratios_ordered) do&lt;br /&gt;
			if i &amp;lt;= j then&lt;br /&gt;
				local b_approx = ET.approximate(et, rat.as_float(b))&lt;br /&gt;
&lt;br /&gt;
				local c = rat.mul(a, b)&lt;br /&gt;
				local c_approx = ET.approximate(et, rat.as_float(c))&lt;br /&gt;
&lt;br /&gt;
				c = rat.modulo_mul(c, et.equave)&lt;br /&gt;
				local c_key = rat.as_ratio(c)&lt;br /&gt;
				if previous[c_key] or ratios[c_key] then&lt;br /&gt;
					if c_approx ~= a_approx + b_approx then&lt;br /&gt;
						mw.log(&amp;quot;a = &amp;quot; .. rat.as_ratio(a) .. &amp;quot;; b = &amp;quot; .. rat.as_ratio(b) .. &amp;quot;; ab = &amp;quot; .. c_key)&lt;br /&gt;
						mw.log(a_approx .. &amp;quot; + &amp;quot; .. b_approx .. &amp;quot; != &amp;quot; .. c_approx)&lt;br /&gt;
						return false&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- find additive consistency limit&lt;br /&gt;
-- returns nil when at least `max_n`&lt;br /&gt;
-- `distinct`: whether distinct ratios are required to be mapped to distinct approximations&lt;br /&gt;
-- - if an integer, it is the regular consistency limit already known&lt;br /&gt;
function p.consistency_limit(et, distinct, max_n)&lt;br /&gt;
	if et.size == 0 then&lt;br /&gt;
		-- the answer is known already&lt;br /&gt;
		return &amp;quot;∞&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	max_n = max_n or 1 / 0&lt;br /&gt;
	distinct = distinct or false&lt;br /&gt;
	local n = 1&lt;br /&gt;
	local last_n = 1&lt;br /&gt;
	local previous = {}&lt;br /&gt;
	while true do&lt;br /&gt;
		if type(distinct) == &amp;quot;number&amp;quot; and n &amp;gt; distinct then&lt;br /&gt;
			return last_n&lt;br /&gt;
		end&lt;br /&gt;
		local ratios = p.limit_modulo_equave(n, et.equave, previous)&lt;br /&gt;
		for key, _ in pairs(ratios) do&lt;br /&gt;
			mw.log(&amp;quot;step &amp;quot; .. n .. &amp;quot;: &amp;quot; .. key)&lt;br /&gt;
		end&lt;br /&gt;
		if next(ratios) ~= nil then&lt;br /&gt;
			local consistent = p.additively_consistent(et, ratios, distinct, previous)&lt;br /&gt;
			if not consistent then&lt;br /&gt;
				mw.log(&amp;quot;Not consistent at step &amp;quot; .. n .. &amp;quot;, returning &amp;quot; .. last_n)&lt;br /&gt;
				return last_n&lt;br /&gt;
			end&lt;br /&gt;
			for key, ratio in pairs(ratios) do&lt;br /&gt;
				previous[key] = ratio&lt;br /&gt;
			end&lt;br /&gt;
			last_n = n&lt;br /&gt;
		end&lt;br /&gt;
		n = n + 1&lt;br /&gt;
		if n &amp;gt; max_n then&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>R-4981</name></author>
	</entry>
</feed>