Addition works, and multiplication works. But subtraction is broken, because there isn't any natural number equal to $23$.
We might think about fixing subtraction, and one way of doing this is by moving to the integers, which allows negative numbers: $\mathbb{Z}=\left\{\dots, 2, 1, 0, 1, 2, \dots\right\}$.
But that still leaves division broken—there isn't any integer equal to $3 \div 4$!
One path forward is to move over to the rational numbers: $\mathbb{Q}=\text{“Proper Fractions”}$. This fixes division and subtraction at the same time. But… this path forward locks us into an infinitely large set. Sometimes (especially in cryptography) it's useful to have a smaller set of numbers that you can actually do ALL the math on.
The official word for “a set of numbers you can do all the math on” is a field. For example, $\mathbb{Q}$ is a field. But (obviously) there are infinitely many fractions, so it's an infinite field. Today you're going to learn about finite fields—which are exactly what they say on the tin. They're sometimes called “Galois fields” (gal'waah fields). They're used in almost all cryptographic algorithms. (They probably have other uses, too. [TODO look this up])
However, building these is a bit complicated. I'll need to explain 3 ideas first.
One popular starting block for thinking about smaller universes of numbers is modular arithmetic. It starts out just like the natural numbers, but when you're about to reach the limit—the “modulus”—the numbers loop back around to 0. Also, if you try to go back below 0, you get sent up to the highest number. This gives you a miniature “toy version” of the integers that you can do math on without having to worry about looking infinity in the eye! (The way that galaxybrained mathematicians think of this is “the quotient set of the integers, using the remainder of division by the modulus as the equivalence operator”—but you absolutely don't need to learn about that to get a basic understanding of how modular arithmetic works.)
Now, no matter what modulus you pick (as long as it's an integer $\ge 2$), addition works great, and multiplication at least kinda works. (Subtraction works perfectly, too; but I'll leave that as an exercise for the reader, since it doesn't matter for what we're doing today.)
For example, here's the integers modulo 8, which I'll write as $\textcolor{indigo}{\mathbb{Z}_8}$ (colored indigo so you can tell the modular integers from this “miniature universe” apart from regular integers):
Addition in $\textcolor{indigo}{\mathbb{Z}_8}$
Notice that (for example) $\textcolor{indigo}{6} + \textcolor{indigo}{2} = \textcolor{indigo}{0}$, because $6 + 2 = 8$, which wraps back around to $88 = \textcolor{indigo}{0}$!
Multiplication in $\textcolor{indigo}{\mathbb{Z}_8}$
Again using the “wraparound arithmetic”, notice that $\textcolor{indigo}{3} \times \textcolor{indigo}{5} = \textcolor{indigo}{7}$, because $3 \times 5 = 15$, which wraps back around to $158 = \textcolor{indigo}{7}$.
However, if you look carefully, you'll also see that $\textcolor{indigo}{4} \times \textcolor{indigo}{6} = \textcolor{indigo}{0}$—that is, two things, neither of which is $\textcolor{indigo}{0}$, multiply to produce $\textcolor{indigo}{0}$! This is technically "allowed", but is very cringe because it flies in the face of common sense, which dictates “If a×b is zero, then either a or b must have been zero!”
In fact, this violation of common sense is so cringe that Nature's God will punish you for it by punching a bunch of holes in your division tables (which ruins them):
"Division" in $\textcolor{indigo}{\mathbb{Z}_8}$
Joking aside, the technical reason the division table is ruined is that $\textcolor{indigo}{2}$, $\textcolor{indigo}{4}$, and $\textcolor{indigo}{6}$ don't have any multiplicative inverse in $\textcolor{indigo}{\mathbb{Z}_8}$—that is, there isn't any solution to “$\textcolor{indigo}{2} \times \textcolor{indigo}{\text{?}} = \textcolor{indigo}{1}$”*. Because of that, we say that division just isn't defined on $\textcolor{indigo}{\mathbb{Z}_8}$.
(*Yes, you guessed right: “$\textcolor{indigo}{4} \times \textcolor{indigo}{\text{?}} = \textcolor{indigo}{1}$” and “$\textcolor{indigo}{6} \times \textcolor{indigo}{\text{?}} = \textcolor{indigo}{1}$” also have no solution. You can doublecheck this yourself by looking back at the multiplication table and noticing there isn't any $\textcolor{indigo}{1}$ to be found in the $\textcolor{indigo}{2}$, $\textcolor{indigo}{4}$, or $\textcolor{indigo}{6}$ columns!)
Now, you might ask: can this be fixed? The answer: yes, but it's hard. (But that's what we're here today to do!)
The easy solution is just to give up and instead use a prime number (like 2; 7; or 6,277,101,735,386,680,763,835,789,423,207,666,416,083,908,700,390,324,961,279) as your modulus. Then, multiplication and division will just work right away, without any problem.
The hard solution requires two more ideas before we can start to explain it… actually, the first of these ideas is the easy solution, so let's look into that!
What if we tried to make a modular arithmetic table with $7$ (which is prime) as the modulus, rather than 8?
Well, I already spoiled it earlier: all the math—including division—will just work. (But let's look at the example anyway!)
Addition in $\textcolor{teal}{\mathbb{F}_7}$
(As you probably expected, nothing to see here; addition never had any problems. Moving along…)
Multiplication in $\textcolor{teal}{\mathbb{F}_7}$
Without putting your finger on it, doesn't that table look… prettier? Tidier? Neater?
OK, now put your finger on it: notice that each column and each row includes each (non$\textcolor{teal}{0}$) element exactly once! That means that you can turn any (non$\textcolor{teal}{0}$) element into any other element, just by a single multiplication! And you'll never accidentally get $\textcolor{teal}{0}$; the only way to reach it by multiplication is by multiplying by $\textcolor{teal}{0}$ on purpose. Of course, this means…
Division in $\textcolor{teal}{\mathbb{F}_7}$
…our division table doesn't have any holes in it—division actually works now!
All this to say that, if (and only if) $p$ is prime, then $\mathbb{Z}_p$ (the integers modulo $p$) is just exactly the same thing as $\mathbb{F}_p$ (the finite field with $p$ elements). Now you know about finite fields with a prime number of elements!
But there are some finite fields with a nonprime number of elements, and we occasionally need those, so let's keep learning until we find out how they work…
Now, the mathematicians call a group of numbers that has addition, subtraction, and multiplication that at least kinda works a ring. (Rings don't care whether division works. As you might have guessed, $\textcolor{indigo}{\mathbb{Z}_8}$ from earlier is a ring.)
Actually, the elements of the ring don't even have to be numbers. They can be any object. Let's create a ring right now with a ridiculous object in it!
We'll start out with $\textcolor{olive}{\mathbb{F}_3}$ (which is a field, admittedly)—
Addition in $\textcolor{olive}{\mathbb{F}_3}$
Multiplication in $\textcolor{olive}{\mathbb{F}_3}$
and we just throw some garbage in there and say “this is an element now”—for example, if we added an arbitrary symbol in just to see how the math would cope: ${\textcolor{olive}{\mathbb{F}_3}}{[{\text{}}]}$.
The good news is: this “adjoinment” does not break addition, subtraction, or multiplication!
The bad news is: it breaks division (which is why the result is called a “ring”), and it has an infinite amount of elements—
Addition in $\textcolor{olive}{\mathbb{F}_3}{[{\text{}}]}$
sudo dnf install \ "https://mirrors.rpmfusion.org/free/el/rpmfusionfreerelease$(rpm E '%rhel').noarch.rpm" \ "https://mirrors.rpmfusion.org/nonfree/el/rpmfusionnonfreerelease$(rpm E '%rhel').noarch.rpm" \ && \ sudo dnf install ffmpeg
I didn't even need to restart Firefox afterwards; it just all seemed to start working immediately
]]>I diagnosed this via dmesg:
[ 108.888963] Intel(R) Wireless WiFi driver for Linux
[ 108.889046] iwlwifi 0000:25:00.0: enabling device (0000 > 0002)
[ 108.889135] iwlwifi 0000:25:00.0: can't disable ASPM; OS doesn't have ASPM control
[ 108.937577] iwlwifi 0000:25:00.0: Direct firmware load for iwlwifi60006.ucode failed with error 2
[ 108.969279] iwlwifi 0000:25:00.0: Direct firmware load for iwlwifi60005.ucode failed with error 2
[ 108.969412] iwlwifi 0000:25:00.0: Direct firmware load for iwlwifi60004.ucode failed with error 2
[ 108.969462] iwlwifi 0000:25:00.0: no suitable firmware found!
[ 108.969495] iwlwifi 0000:25:00.0: minimum version required: iwlwifi60004
[ 108.969530] iwlwifi 0000:25:00.0: maximum version supported: iwlwifi60006
[ 108.969577] iwlwifi 0000:25:00.0: check git://git.kernel.org/pub/scm/linux/kernel/git/firmware/linuxfirmware.git
The “solution” was to do this (on a live system which can't persist any changes between reboots and doesn't have easy access to install packages):
/mnt
(or download the RPM package at the below link)iwlwifi60004.ucode
from $source/lib/firmware
to /lib/firmware
modprobe r iwlwifi; modprobe iwlwifi
Disturbingly, this seems to be a regression. They have the firmware available for RL8—iwl6000firmware
—only it's vanished from the RL9 repos.
If you want to ignore this omen and continue installing RL9 anyway, you can just save that RPM file somewhere and then install it again on the system after it reboots into the installed RL9. Unlike a live system, you don't need to do the above mumbojumbo; you only need to install that package and then reboot.
If you don't have an (additional) flash drive on hand, and just using Ethernet isn't an option, I recommend alttabbing out of the installer while it's running to smuggle the file into the inprogress system, specifically /mnt/sysroot/root
, so you can access it easily in any event.
8 months and 14 days after the day my account was alleged to have been deactivated for inactivity, I got a surprise order in—my first ever order as an Amazon Seller! Since the account was abandoned, I hadn't bothered keeping it up to date through a change of phone number. I figured if I ever needed to, I could just reactivate it with email.
So I reset the password—with no problem, mind you; my email was still valid—and tried to get back into the account. I was stuck on the phoneOTP page, and it didn't offer any alternatives; clicking the link for alternatives just directed me to a number to contact Amazon Customer Support. I then spent a few hours on the phone over the course of a few days trying to get back into the account—including uploading my ID for verification, which “reactivated” the nonseller side of my account and allowed me to (halfway) log in to it, but I still couldn't view or change any account settings, such as phone number, without receiving an SMS code at my old number.
The sequence of phone calls ended with me submitting the following ticket to the Seller Central Technical Support Page form, which explicitly states “ If you cannot contact us through Seller Central, please contact us using the form below”. It only offers 3 ticket types: Password Reset, Account Termination, and “Reactivate Your Account” (I chose the last of these, since the password reset actually works selfservice, and I certainly don't want to terminate my account):
I'm trying to ship order #11285748816472201.
I cannot log in because I no longer have access to my old phone number (██████████). How can I regain access to my seller account so that I can ship this order?
I just got off a phone call with a representative who said that this contact form is my only chance at restoring access.
A few hours later, I got this reply:
This email is not the correct channel to report login issues.
However in order to help you, I'm providing you with the below information.
If you encounter signin issues due to the issues with 2 step verification, try the following steps:
If your phone is lost or stolen, contact your carrier immediately and ask them to block or suspend your line, until you can figure out what happened.
To gain access to your seller account, try logging into Seller Central and click Didn't receive the code? on the bottom of the TwoStep Verification page. Select your backup method for receiving your code.
If you don't have a backup device and can't change your settings, you'll need to go through the TwoStep Verification Account Recovery process. This process requires you to submit documentation verifying your identity. Once verified (usually within 12 hours), TwoStep Verification will be disabled so you can log in. On your next login, you will be required to set up TwoStep Verification again, this time using devices that you have access to.
To access Password Assistance tool click on the below link
https://sellercentral.amazon.com/ap/forgotpassword?openid.assoc_handle=sc_na_amazon_v2&pageId=sc_na_amazon_v2Please click on the below link for TwoStep Verification FAQ
https://sellercentral.amazon.com/help/hub/reference/external/202153510For more information about Seller Central sign in help, please use the below help page:
https://sellercentral.amazon.com/help/hub/reference/external/loginhelpI hope this helps.
I tried all these, with no luck.
This response didn't permit an email reply, only a reply through the online portal (which I couldn't access due to being logged out—I did try), so I replied back through the same form:
(RE CASE 13397397731. I can't reply on the portal because I can't log in. I was directed to this form by phone support in Customer Service Reply ID A1IS0W6E70DFNO.)
My phone wasn't lost or stolen. I changed numbers years ago and forgot about this account until I got an email telling me that I finally got an Order (#11285748816472201).
When I try to log in, it sends an OTP to my old number. There is no button that says “Didn't receive the code?”, but there is a link that says “If you can’t receive the code, or if you changed your email or phone number, try a different way.” When I click that link, it just says “To continue, you'll need to contact Customer Service.” and directs me to a page with a support phone number which directed me to this form after a very long call.
You say to try the “TwoStep Verification Account Recovery”, but when I I visit https://www.amazon.com/a/recover/upload it requires me to log in and gives the same result as trying to log in normally, directing me to Customer Service without giving me the opportunity to upload ID verification.
How can I get back into my Seller Account so I can ship order #11285748816472201?
Depressingly, their reply gave 0 indication they'd read my ticket:
Thank you for contacting Amazon.
I understand you are having issues with, logging into your selling account.
I have some information and resources to assist you.
We'd suggest you to refer to the link here – https://sellercentral.amazon.com/help/hub/reference/external/202153510 for more details on 2 step verification code.
(Yes, the link they sent is just a help article which links to the very page I said wasn't working for me!)
Worried that my previous message to them was too long, I tried the BLUF strategy:
I cannot get into my account.
Per my previous email, the TwoStep Recovery Process isn't available; clicking the link to recover my account only directs me to contact customer service when I can't access the OTP.
(RE CASE 13397397731 & 13401113931. I can't reply on the portal because I can't log in. I was directed to this form by phone support in Customer Service Reply ID A1IS0W6E70DFNO.)
But they gave a fucking functionally identical canned nonsequitur response:
Thank you for contacting Amazon.
I understand you are having issues with, two step verification.
I have some information and resources to assist you.
Please follow the steps mentioned in "Seller Central Sign In help section".
This page can be access after clicking on 'Help' option on the log in page.
Here is the direct link: https://sellercentral.amazon.com/help/hub/reference/external/loginhelp
You can view your account performance at (https://sellercentral.amazon.com/performance/dashboard?ref=ah_em_op) or select Account Health on the home screen of the Amazon Seller app on your iOS or Android device. Your Account Health shows how well your account is performing against the performance metrics and policies required to sell on [sic]
— Download iOS App at (https://itunes.apple.com/na/app/amazonseller/
— Download Android App at (https://play.google.com/store/apps/details?id=com.amazon.sellermobile.android&hl[sic])Thank you for taking the time to seek assistance with maintaining your Account Health.
I apologize from the bottom of my heart to whoever placed Amazon Order #11285748816472201. Your cables will be very late, and delivered by another seller, because Amazon did not permit me to log on and print the shipping label in time for the order window.
]]>To change your name on your driver’s license in Alabama without any extenuating circumstances (not getting married, no native tribal government OKing the change, etc.) will cost about $90, including materials; not including whatever you value your own time at; not including replacement certificates for various personal achievements. I vaguely recommend doing things in this order:
Between amending the birth certificate and getting the court order for name change, there’s a bit of a pinch:
Let’s say that you don’t want to get the court order. Maybe you’re a sovereign citizen or currently entertaining their psychological impulse. Maybe you live in Madison County and want to avoid spending 37 bucks. Maybe you have some other reason. Whatever. Here’s what I’ve found so far:
First: other states may be more flexible, but in Alabama, you absolutely cannot get a new state ID (“Driver’s License”) until you’ve updated your name with the SSA.
Second: the SSA does not accept name changes without proof of the “name change event” per se (RM 10212.010).
Third: Per RM 10212.165 (H) (and, indirectly, RM 10212.010), the SSA does not currently consider even a commonlawamended state ID to be “evidence” of a ”name change event”; it requires something to attest the change, and their hypothetical Annette Martin’s amended (nonAlabamian) ID card doesn’t link the old and new names together in any way. (It’s unclear whether they would accept two ID cards from the same state issued with the same number but different names as evidence of the change; I couldn’t find policy or anecdote either way on this point, but would be willing to bet it’d not be accepted until or unless the policy’s updated to allow that specifically.)
Fourth: If you are able to amend your birth certificate atwill, and want to use it in lieu of a court order to bootstrap changes to your Social Security card and state ID card, the SSA has published inconsistent and unclear documentation on whether this’d work. RM 10212.001 and the online informational page imply an amended birth certificate would work; Publication No. 0510513 implies it won’t. The clerk I spoke with inperson said that an amended birth certificate wouldn’t be accepted. But oSSNAP, the online alternative to SS‒5, explicitly names an amended birth certificate as an option for this proof, though SS‒5 itself is ambiguous. Most annoyingly, RM 10212.095 & RM 10212.090 (which identify themselves as containing the bottomline answer to this question) are also unclear. (Or maybe I just have poor reading comprehension.)
(The Alabama DMV’s documentation on supporting documents they allow/require to accompany the proofofchangewithSSA is even more sparse.)
In any case, I was not able to find solid anecdotes online about lodging name changes with either the SSA or Alabama DMV without a court order, adoption, or marriage documentation; if you have any experience trying this, let me know and I’ll update this post!
]]>Transcribed from Forbes, youtube.com/video/O4WJbOKQOfM (1:37), adapted slightly for the Web.
]]>My name is Seth Dillon. I'm the CEO of The Babylon Bee, a popular humor site that satirizes realworld events and public figures.
Our experience with Big Tech censorship dates back to 2018, when Facebook started working with “factcheckers” to crack down on the spread of “misinformation”. We published a headline that read “CNN Purchases IndustrialSize Washing Machine to Spin The News Before Publication”. Snopes rated that story “False”, prompting Facebook to threaten us with a permanent ban.
Since then, our jokes have been repeatedly “factchecked”, flagged for “hate speech”, and removed for “incitement of violence”, resulting in a string of [platform moderation] warnings and a drastic reduction in our reach. Even our email service has suspended us for spreading “harmful misinformation”. We found ourselves taking breaks from writing jokes to go on TV and defend our right to tell them in the first place. That’s an awkward position to be in as humorists in a free society.
Last year, we made a joke about Rachel Levine, a transgender health admiral [Assistant Secretary for Health] in the Biden administration. USA Today had named Levine “Woman of the Year”, so we fired back, in defense of women and sanity, with this satirical headline: “The Babylon Bee’s Man of the Year is Rachel Levine”. Twitter was not amused. They locked our account for “hateful conduct”, and we spent the next eight months in “Twitter jail” [with platform posting privileges revoked]. We learned the hard way that censorship guards the narrative, not the truth. In fact, it guards the narrative at the expense of the truth.
All the more outrageous was Twitter’s lipservice commitment to “free expression”. Twitter’s mission, they write, is to “give everyone the power to create and share ideas and information and to express their opinions and beliefs without barriers”. As promising as that sounds, it rings hollow when you consider all the barriers that we — and so many others — have encountered. The comedian’s job is to poke holes in the popular narrative. If the popular narrative is offlimits, then comedy itself is offlimits, and that’s basically where we find ourselves today. Our speech is restricted to the point where we can’t even joke about the insane ideas that are being imposed on us from the top down. The only reason Twitter is now an exception is [that] the world’s richest man [Elon Musk] took matters into his own hands and “declared comedy legal again”. We should all be thankful that he did. The most offensive comedy is harmless when compared with even the most wellintentioned censorship.
I hope we can all agree that we shouldn’t have to depend on benevolent billionares to safeguard speech; that’s a function of the law. But the law only protects against government censorship; it hasn’t caught up to the fact that the vast majority of public discourse now takes place on private platforms. But where is the law that protects us from [the owners of those platforms]? The lovers of censorship will tell [us] “there can be no such law; the constitution won’t allow it.” But they’re wrong, and their arguments fail. I only have time to deal with a few of them, very briefly.
(1) They [claim] “private companies are free to do what they want.”
That’s nonsense, especially when applied to companies that serve a critical public function. A transportation service can’t ban passengers based on their viewpoints, nor can telecom providers; under “common carrier” [legal] doctrine, they’re required to treat everyone equally. That precedent applies comfortably to big tech. The argument that “only the government can be guilty of censorship” falls short, because it fails to make a distinction between the way things are, and the way they should be. If these platforms are “the modern public square”, as the Supreme Court has described them, then speech rights should be protected there, even if they presently are not. The current state of affairs being what thay are is not a good argument for failing to take action to improve them. But, beyond that, these platforms have explicitly promised free expression “without barriers”. To give us anything less than that is fraud.
(2) They [claim] “these platforms have a 1st amendment right to censor.”
— as if censorship is a form of protected speech [—] it isn’t; censorship is a form of conduct. The state has always been able to regulate conduct. The idea that “censorship is speech” was forcefully rejected by the 5th circuit court of appeals in their recent decision to uphold an antidiscrimination law in Texas. The court mocked the idea that “buried somewhere in the enumerated right to free speech lies a corporation’s unenumerated right to muzzle speech”. No such right exists. And how could it? The claim that “censorship is speech” is as nonsensical as saying “war is peace” or “freedom is slavery”.
(3) They [claim] “these platforms are like newspapers; they can’t be forced to print anything they don’t want to”.
But they aren’t like newspapers; they aren’t curating every piece of content they host, and they aren’t expressing themselves when they host it. They’re merely conduits for the speech of others. That’s how they’ve repeatedly described themselves, including in court proceedings, and that’s how Section 230 [of the Communications Decency Act] defines them.
As a final point, I think it’s important to acknowledge that a call for an end to censorship is not a call for an end to content moderation (some will try to make that claim). But §230 gives these platforms clearance to moderate “lewd, obscene, and unlawful” speech, and antidiscrimination legislation would respect that. The only thing it would prevent is viewpoint discrimination. And such prevention would not be unconstitutional, because it would only regulate platforms’ conduct; it would neither compel nor curb their speech.
The problem I had today was: I needed to to create a bijection between the natural numbers and all finite strings from a given finite alphabet. Here’s basically how I worked through that, with a code sample at the end.
(The “alphabet” will be $A=\left\{c_1, c_2, \dots, c_k\right\}$. For example, you might set English strings in a 27character alphabet with $c_1=\text{‘A’}$, $c_{26}=\text{‘Z’}$, and $c_{27}=\text{Space}$; or Morse Code strings in a 2character alphabet with $c_1=\text{‘·’}$ and $c_2=\text{‘‒’}$; or octet strings with $k=2^8, c_x=x1$.)
Remember, the goal is to create a bijection, which means that every string (even weird ones with trailing — or leading — spaces!) needs to be represented, and we can’t “cheat” by transmitting the length separately; the bijection must be between $\mathbb{N}\leftrightarrow A_k^\ast$.
I couldn’t figure out how to make this, so I just started pairing elements up by hand like an idiot, hopeful I'd spot the pattern:
Then it hit me: instead of continuing to melt my brain counting these darn offsets on my fingers and hoping that, if I did enough of them, I’d be able to scry a fully general formula that fits them into infinity, I could just quarantine off each “epoch” from each other, and see if that makes it easier (it did!)
So now I end up with this much easier starting point:
So, say that my string $s$ has $n$ elements. All I need to do is calculate a ranking of my string within that epoch, then add $\sum_{j=0}^{n1}{k^j}$ to that, and I’ll be guaranteed not to step on the toes of any previous epochs! (And I won’t collide with larger epochs, either, by the same logic!)
Now that I don’t have to keep the whole universe of $A_k^\ast$ in my head anymore, intraepoch ranking is pretty easy: just treat the string as a base$k$ number — $f\left(s\right): A_k^n \to \mathbb{N} = \sum_{i=1}^{n}{k^{i1} s_i}$.
Then to wrap it up:
…now, inverting that formula isn’t very clean. (I scrapped the Mathjax render of it.)
But it comes out OK in Python, anyway:
def rank(s, k, symbol_rank=ord):
i = 0
offset = 0
for j, c in enumerate(map(symbol_rank, s)):
assert 0 <= c < k
offset = offset + k**j
i = i*k + c
return i + offset
def unrank(i, k, return_cast=lambda it: str().join(map(chr, it))):
offset, next_offset = 0, 1
j = 0
while next_offset < i:
offset = next_offset
j += 1
next_offset += k**j
i = offset
l = []
for j in range(length):
i, c = divmod(i, k)
l.append(c)
assert i == 0
l.reverse()
return return_cast(l)
]]>§1–§4, §6–10, §11–14, and §15–18 describe the physical appearance, (public) operation, and cultural/historical context of the chess robot; §5 and §19 actually present the argument that the robot can't be a “genuine” (or “pure machine”) mechanical chess player — that it must have a human operator.
§5 sketches the outline of the argument:
Abridged  Original Verbiage 

It’s inconceivable that any physical computer could execute a free loop; all effectively computable algorithms are deterministic and primitive recursive. 

A game of Chess (with at least one human player) is not deterministic. 

It would require groundbreaking research to design a computer which could cope with unpredictable inputs (such as an opponent player's choice of move). 

There was (allegedly) no groundbreaking research involved in the robot's construction. 

§19 is a list of 17 items, which can be sieved into three broad categories: Noticing mistakes in the concealment of the human operator (#2, #4, #5, #9, #11, #12, and #14); speculating on circumstantial evidence of a human operator (#6, #7, #8, #10, #13, #15, #16, and #17); and continuing the argument which he started in §5 (#1, #3). I won't go into detail on those first two.
Abridged  Original Verbiage 

Polling and interrupts are both inconceivable — a computer could not possibly await inputs which arrive at an unknown delay. 

Any game AI except totally complete minimax (which would guarantee the potential for a 0% loss rate) is inconceivable (except for intentionally handicapped versions of minimax). However, the robot sometimes loses. Therefore, it cannot have a game AI. 

Note that he argues for a true proposition (Maelzel's chess robot was human operated), by an invalid argument (that it’s not possible to build a chess robot — “this matter is susceptible of a mathematical demonstration, a priori”).
]]>To fix this, you'll need to create this file:
/* …/Profiles/xxxxxxxx.defaultesr/chrome/userChrome.css */
#fullscrtoggler {
// backgroundcolor: red;
display: none;
}
(If you can't figure out how to open that file or create it in the first place, this tutorial seems pretty good for Windows. On Linux, it's hiding inside ~/.mozilla/firefox
, which is a hidden folder you can probably access by opening your file manager and pressing Ctrl
–H
. Note that you will likely have to create the subfolder chrome
.)
Once that CSS file exists, enable toolkit.legacyUserProfileCustomizations.stylesheets
in about:config, and restart the browser.
On the Wikipedia page about multisets, I found this elaborate diagram showing a bijection between the k=3element multisets of a n=5element universe and the kelement subsets of an n+k−1element universe. While this certainly showed that the bijection exists for k=3; n=5, and at least marginally convinced me that it would generalize, it seemed very convoluted and hard to interpret. After much puzzling, I was able to translate it into code, but how it worked still escaped me. However, after studying the code translation for a while, I figured it out—it's so incredibly simple—all you need to do to take a multiset and reversibly transform it into a set of the same cardinality belonging to the smallest feasible universe is incrementally offset every element (including nonunique ones)!
That is: start with the multiset's smallest element, add 0 to it; then go to the next element (which might be a duplicate), and add 1 to it (which will guarantee it's no longer a duplicate); then go to the next element (which might still be a duplicate of the first), and add 2 to it (which will guarantee it's no longer a duplicate of the first or second elements), and so on. After this transformation is applied, you'll have a set with no duplicates, from a k−1elementslarger universe, that can easily be transformed back by just subtracting instead of adding!
Now, you might ask, “well, what if my elements aren't integers?” In that case, just order the elements (you are authorized by God to fake this if you feel like there's no obvious ordering) and biject them over into an (obviously contiguous, ideally 0indexed) block of integers for the transformation. (So replace the “smallest” unique element with 0, the “secondsmallest” unique element with 1, et cetera.) You will need a larger target set than your source set, anyway, and with integers you get “for free” an easy way to cope with this requirement.
Below, I've included some example code demonstrating this simplified interpretation of the bijection, plus a demo of the combinatorial number system thrown in for good measure.
from math import comb as _comb
from itertools import count as _count
_Multiset = list # :^)
def combination_to_multiset(s):
return _Multiset(elem  offset for offset, elem in enumerate(sorted(s)))
def multiset_to_combination(ms):
return set(elem + offset for offset, elem in enumerate(sorted(ms)))
# Bonus methods
def multicomb(n, k):
"https://en.wikipedia.org/wiki/Multiset#Counting_multisets"
return _comb(n + k  1, k)
def integer_to_combination(i, k, n):
"https://en.wikipedia.org/wiki/Combinatorial_number_system#Finding_the_kcombination_for_a_given_number"
s = set()
universe = range(n)
if not 0 <= i < _comb(n, k):
raise ValueError(f"not 0 <= {i} < comb({n}, {k})")
for j in range(k, 0, 1):
elem = _search_maxsatisfying(lambda n, r=j, N=i, comb=_comb: _comb(n, r) <= N)
assert elem in universe
assert elem not in s
s.add(elem)
i = _comb(elem, j)
assert i == 0
return s
def combination_to_integer(s):
"https://en.wikipedia.org/wiki/Combinatorial_number_system#Place_of_a_combination_in_the_ordering"
return sum(_comb(elem, k+1) for k, elem in enumerate(sorted(s)))
def _search_maxsatisfying(predicate, initial=0):
"Return the largest n for which predicate succeeds"
lower_bound = initial
upper_bound = lower_bound + 1
if not predicate(lower_bound):
raise ValueError(f"initial does not satisfy predicate")
# 1. Exponential approach to establish upperbound
while predicate(upper_bound):
upper_bound = upper_bound*2
guess = lower_bound = (upper_bound  1) and (upper_bound // 2)
# 2. Binary search
while (upper_bound  lower_bound) > 1:
guess = lower_bound + (upper_bound  lower_bound) // 2
if not predicate(guess):
upper_bound = guess
guess = lower_bound
else:
lower_bound = guess
assert predicate(guess) and not predicate(guess+1)
return guess
# Composed methods
def integer_to_multiset(i, k=None, n=43252003274489856000):
# TODO: fix redundancy to enable incremental decoding
# https://discord.com/channels/834837272234426438/866699434116775946/1112819325666070539?invite=WZvZMVsXXR
if k is None:
assert n > 1
k = next(k for k in _count(1) if multicomb(n, k) > i)
nPrime = n + k  1
return combination_to_multiset(integer_to_combination(i, k, nPrime))
def multiset_to_integer(ms):
return combination_to_integer(multiset_to_combination(ms))
]]>