What is the theory behind seeding a CRC?
$begingroup$
The basic CRC check is a polynomial division in this form:
$$
Q(x)Gen(x) + Rem(x) = frac {x^nMsg(x) } { Gen(x) }
$$
It's recommended that the polynomial is seeded so that an all-zero message does not result in an all-zero checksum too.
As far as I can tell, with a seed the polynomial division equation becomes:
$$
Q(x)Gen(x) + Rem(x) = frac {x^{2n}Seed(x) + x^nMsg(x) } { Gen(x) }
$$
But if the message Msg(x) is zero, then is there not a case that the generator polynomial could be a factor of the scaled seed, and we get a zero remainded Rem(x)?
coding-theory
$endgroup$
add a comment |
$begingroup$
The basic CRC check is a polynomial division in this form:
$$
Q(x)Gen(x) + Rem(x) = frac {x^nMsg(x) } { Gen(x) }
$$
It's recommended that the polynomial is seeded so that an all-zero message does not result in an all-zero checksum too.
As far as I can tell, with a seed the polynomial division equation becomes:
$$
Q(x)Gen(x) + Rem(x) = frac {x^{2n}Seed(x) + x^nMsg(x) } { Gen(x) }
$$
But if the message Msg(x) is zero, then is there not a case that the generator polynomial could be a factor of the scaled seed, and we get a zero remainded Rem(x)?
coding-theory
$endgroup$
add a comment |
$begingroup$
The basic CRC check is a polynomial division in this form:
$$
Q(x)Gen(x) + Rem(x) = frac {x^nMsg(x) } { Gen(x) }
$$
It's recommended that the polynomial is seeded so that an all-zero message does not result in an all-zero checksum too.
As far as I can tell, with a seed the polynomial division equation becomes:
$$
Q(x)Gen(x) + Rem(x) = frac {x^{2n}Seed(x) + x^nMsg(x) } { Gen(x) }
$$
But if the message Msg(x) is zero, then is there not a case that the generator polynomial could be a factor of the scaled seed, and we get a zero remainded Rem(x)?
coding-theory
$endgroup$
The basic CRC check is a polynomial division in this form:
$$
Q(x)Gen(x) + Rem(x) = frac {x^nMsg(x) } { Gen(x) }
$$
It's recommended that the polynomial is seeded so that an all-zero message does not result in an all-zero checksum too.
As far as I can tell, with a seed the polynomial division equation becomes:
$$
Q(x)Gen(x) + Rem(x) = frac {x^{2n}Seed(x) + x^nMsg(x) } { Gen(x) }
$$
But if the message Msg(x) is zero, then is there not a case that the generator polynomial could be a factor of the scaled seed, and we get a zero remainded Rem(x)?
coding-theory
coding-theory
asked Jan 18 at 1:02
MartyMarty
1012
1012
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
$begingroup$
The OP's "equations"are not quite right. If the data that is to be transmitted is represented by $d(x)$ and the CRC polynomial is $C(x)$ of degree $n$, then the no bells and whistles CRC algorithm divides $x^nd(x)$ by $C(x)$ to produce a quotient polynomial $q(x)$ and a remainder polynomial $r(x)$ of degree smaller than $n$, the degree of $C(x)$. The CRC checksum is $r(x)$. The equation describing the relationship is
$$x^nd(x) = q(x)C(x) + r(x)tag{1}$$
and not what the OP has written. Now from $(1)$, we get that
$$q(x)C(x) = x^nd(x) - r(x) = x^nd(x) + r(x)tag{2}$$
where the second equality is using the fact that in the binary field, addition and subtraction are the same operation. Thus, $x^nd(x) + r(x)$ is a multiple of the CRC polynomial $C(x)$. What is transmitted is $x^nd(x) + r(x)$. But notice that the coefficients of $x^0, x, x^2, ldots, x^{n-1}$ in $x^nd(x)$ all are $0$ while $r(x)$ is of degree $n-1$ or less, and so we see that what is actually transmitted is the data bits (the $x^nd(x)$ part) followed by the CRC checksum $r(x)$: the trailing $n$ zeroes in $x^nd(x)$ have been neatly filled in by the CRC checksum.
Now, if $d(x)$, the data to be transmitted, is a long string of zeroes, then $(1)$ and $(2)$ show that the CRC checksum is a string is $n$ zeroes, and so the entire transmission is a long string of zeroes. This is deemed to be unsuitable for a variety of reasons, and there are various bells and whistles versions of the CRC computation that avoid the possibility that a transmission consists entirely of zeros. One of these bells and whistles versions prepends a nonzero header to the data to be transmitted (the header is discarded at the receiver). Thus, if we have $M$ bits of data (and so $d(x)$ is of degree $M-1$) and the header $h(x)$ is $m$ bits in length, then what gets divided by $C(x)$ is not $x^nd(x)$ but instead $x^{m+M+n}h(x) + x^nd(x)$ which stream of bits is the header $h(x)$ followed by the data string $d(x)$ followed $n$ zeroes. What gets sent out over the channel (or recorded in memory or disk or flash drive) is $x^{m+M+n}h(x) + x^nd(x) + hat{r}(x)$ where $hat{r}(x)$ is the remainder when $x^{m+M+n}h(x) + x^nd(x)$ is divided by $C(x)$; it is different from the remainder when $x^nd(x)$ is divided by $C(x)$. In particular, even if $d(x)$ is a stream of zeroes, $hat{r}(x)$ is nonzero (unless the system designer not thought through the problem and has chosen $h(x)$ to be $C(x)$ itself (or a polynomial multiple of $C(x)$ which should be a fireable offense!) The CRC checksum being all zeroes is not an issue now even if $d(x)$ is all zeroes: the header and CRC checksum are nonzero. Another alternative is to simply complement the first two data bytes (used if $C(x)$ has degree 16) or four data data bytes (if $C(x)$ has degree 32) before passing them to the division circuit that computes the remainder from the division of $x^nd(x)$. The receiver must, if curse, remember to undo the complementation suffered by the leading data bytes at the transmitter. This method does not increase the transmission length but has the obvious disadvantage that if the data happens to be the size of the US national debt (a number in the trillions with a large number of trailing zeros), complementation of the leading bytes at the transmitter might modify the transmitted data stream to be all zeroes!
$endgroup$
$begingroup$
Thanks for taking the time to answer, Dilip! But my question is how is the seed value folded into the equations? The seed isn't normally transmitted as part of the message - it's agreed between the rx and tx up-front. I just don't know how it works in the maths...
$endgroup$
– Marty
Jan 19 at 17:17
add a comment |
Your Answer
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "69"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
noCode: true, onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fmath.stackexchange.com%2fquestions%2f3077723%2fwhat-is-the-theory-behind-seeding-a-crc%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
$begingroup$
The OP's "equations"are not quite right. If the data that is to be transmitted is represented by $d(x)$ and the CRC polynomial is $C(x)$ of degree $n$, then the no bells and whistles CRC algorithm divides $x^nd(x)$ by $C(x)$ to produce a quotient polynomial $q(x)$ and a remainder polynomial $r(x)$ of degree smaller than $n$, the degree of $C(x)$. The CRC checksum is $r(x)$. The equation describing the relationship is
$$x^nd(x) = q(x)C(x) + r(x)tag{1}$$
and not what the OP has written. Now from $(1)$, we get that
$$q(x)C(x) = x^nd(x) - r(x) = x^nd(x) + r(x)tag{2}$$
where the second equality is using the fact that in the binary field, addition and subtraction are the same operation. Thus, $x^nd(x) + r(x)$ is a multiple of the CRC polynomial $C(x)$. What is transmitted is $x^nd(x) + r(x)$. But notice that the coefficients of $x^0, x, x^2, ldots, x^{n-1}$ in $x^nd(x)$ all are $0$ while $r(x)$ is of degree $n-1$ or less, and so we see that what is actually transmitted is the data bits (the $x^nd(x)$ part) followed by the CRC checksum $r(x)$: the trailing $n$ zeroes in $x^nd(x)$ have been neatly filled in by the CRC checksum.
Now, if $d(x)$, the data to be transmitted, is a long string of zeroes, then $(1)$ and $(2)$ show that the CRC checksum is a string is $n$ zeroes, and so the entire transmission is a long string of zeroes. This is deemed to be unsuitable for a variety of reasons, and there are various bells and whistles versions of the CRC computation that avoid the possibility that a transmission consists entirely of zeros. One of these bells and whistles versions prepends a nonzero header to the data to be transmitted (the header is discarded at the receiver). Thus, if we have $M$ bits of data (and so $d(x)$ is of degree $M-1$) and the header $h(x)$ is $m$ bits in length, then what gets divided by $C(x)$ is not $x^nd(x)$ but instead $x^{m+M+n}h(x) + x^nd(x)$ which stream of bits is the header $h(x)$ followed by the data string $d(x)$ followed $n$ zeroes. What gets sent out over the channel (or recorded in memory or disk or flash drive) is $x^{m+M+n}h(x) + x^nd(x) + hat{r}(x)$ where $hat{r}(x)$ is the remainder when $x^{m+M+n}h(x) + x^nd(x)$ is divided by $C(x)$; it is different from the remainder when $x^nd(x)$ is divided by $C(x)$. In particular, even if $d(x)$ is a stream of zeroes, $hat{r}(x)$ is nonzero (unless the system designer not thought through the problem and has chosen $h(x)$ to be $C(x)$ itself (or a polynomial multiple of $C(x)$ which should be a fireable offense!) The CRC checksum being all zeroes is not an issue now even if $d(x)$ is all zeroes: the header and CRC checksum are nonzero. Another alternative is to simply complement the first two data bytes (used if $C(x)$ has degree 16) or four data data bytes (if $C(x)$ has degree 32) before passing them to the division circuit that computes the remainder from the division of $x^nd(x)$. The receiver must, if curse, remember to undo the complementation suffered by the leading data bytes at the transmitter. This method does not increase the transmission length but has the obvious disadvantage that if the data happens to be the size of the US national debt (a number in the trillions with a large number of trailing zeros), complementation of the leading bytes at the transmitter might modify the transmitted data stream to be all zeroes!
$endgroup$
$begingroup$
Thanks for taking the time to answer, Dilip! But my question is how is the seed value folded into the equations? The seed isn't normally transmitted as part of the message - it's agreed between the rx and tx up-front. I just don't know how it works in the maths...
$endgroup$
– Marty
Jan 19 at 17:17
add a comment |
$begingroup$
The OP's "equations"are not quite right. If the data that is to be transmitted is represented by $d(x)$ and the CRC polynomial is $C(x)$ of degree $n$, then the no bells and whistles CRC algorithm divides $x^nd(x)$ by $C(x)$ to produce a quotient polynomial $q(x)$ and a remainder polynomial $r(x)$ of degree smaller than $n$, the degree of $C(x)$. The CRC checksum is $r(x)$. The equation describing the relationship is
$$x^nd(x) = q(x)C(x) + r(x)tag{1}$$
and not what the OP has written. Now from $(1)$, we get that
$$q(x)C(x) = x^nd(x) - r(x) = x^nd(x) + r(x)tag{2}$$
where the second equality is using the fact that in the binary field, addition and subtraction are the same operation. Thus, $x^nd(x) + r(x)$ is a multiple of the CRC polynomial $C(x)$. What is transmitted is $x^nd(x) + r(x)$. But notice that the coefficients of $x^0, x, x^2, ldots, x^{n-1}$ in $x^nd(x)$ all are $0$ while $r(x)$ is of degree $n-1$ or less, and so we see that what is actually transmitted is the data bits (the $x^nd(x)$ part) followed by the CRC checksum $r(x)$: the trailing $n$ zeroes in $x^nd(x)$ have been neatly filled in by the CRC checksum.
Now, if $d(x)$, the data to be transmitted, is a long string of zeroes, then $(1)$ and $(2)$ show that the CRC checksum is a string is $n$ zeroes, and so the entire transmission is a long string of zeroes. This is deemed to be unsuitable for a variety of reasons, and there are various bells and whistles versions of the CRC computation that avoid the possibility that a transmission consists entirely of zeros. One of these bells and whistles versions prepends a nonzero header to the data to be transmitted (the header is discarded at the receiver). Thus, if we have $M$ bits of data (and so $d(x)$ is of degree $M-1$) and the header $h(x)$ is $m$ bits in length, then what gets divided by $C(x)$ is not $x^nd(x)$ but instead $x^{m+M+n}h(x) + x^nd(x)$ which stream of bits is the header $h(x)$ followed by the data string $d(x)$ followed $n$ zeroes. What gets sent out over the channel (or recorded in memory or disk or flash drive) is $x^{m+M+n}h(x) + x^nd(x) + hat{r}(x)$ where $hat{r}(x)$ is the remainder when $x^{m+M+n}h(x) + x^nd(x)$ is divided by $C(x)$; it is different from the remainder when $x^nd(x)$ is divided by $C(x)$. In particular, even if $d(x)$ is a stream of zeroes, $hat{r}(x)$ is nonzero (unless the system designer not thought through the problem and has chosen $h(x)$ to be $C(x)$ itself (or a polynomial multiple of $C(x)$ which should be a fireable offense!) The CRC checksum being all zeroes is not an issue now even if $d(x)$ is all zeroes: the header and CRC checksum are nonzero. Another alternative is to simply complement the first two data bytes (used if $C(x)$ has degree 16) or four data data bytes (if $C(x)$ has degree 32) before passing them to the division circuit that computes the remainder from the division of $x^nd(x)$. The receiver must, if curse, remember to undo the complementation suffered by the leading data bytes at the transmitter. This method does not increase the transmission length but has the obvious disadvantage that if the data happens to be the size of the US national debt (a number in the trillions with a large number of trailing zeros), complementation of the leading bytes at the transmitter might modify the transmitted data stream to be all zeroes!
$endgroup$
$begingroup$
Thanks for taking the time to answer, Dilip! But my question is how is the seed value folded into the equations? The seed isn't normally transmitted as part of the message - it's agreed between the rx and tx up-front. I just don't know how it works in the maths...
$endgroup$
– Marty
Jan 19 at 17:17
add a comment |
$begingroup$
The OP's "equations"are not quite right. If the data that is to be transmitted is represented by $d(x)$ and the CRC polynomial is $C(x)$ of degree $n$, then the no bells and whistles CRC algorithm divides $x^nd(x)$ by $C(x)$ to produce a quotient polynomial $q(x)$ and a remainder polynomial $r(x)$ of degree smaller than $n$, the degree of $C(x)$. The CRC checksum is $r(x)$. The equation describing the relationship is
$$x^nd(x) = q(x)C(x) + r(x)tag{1}$$
and not what the OP has written. Now from $(1)$, we get that
$$q(x)C(x) = x^nd(x) - r(x) = x^nd(x) + r(x)tag{2}$$
where the second equality is using the fact that in the binary field, addition and subtraction are the same operation. Thus, $x^nd(x) + r(x)$ is a multiple of the CRC polynomial $C(x)$. What is transmitted is $x^nd(x) + r(x)$. But notice that the coefficients of $x^0, x, x^2, ldots, x^{n-1}$ in $x^nd(x)$ all are $0$ while $r(x)$ is of degree $n-1$ or less, and so we see that what is actually transmitted is the data bits (the $x^nd(x)$ part) followed by the CRC checksum $r(x)$: the trailing $n$ zeroes in $x^nd(x)$ have been neatly filled in by the CRC checksum.
Now, if $d(x)$, the data to be transmitted, is a long string of zeroes, then $(1)$ and $(2)$ show that the CRC checksum is a string is $n$ zeroes, and so the entire transmission is a long string of zeroes. This is deemed to be unsuitable for a variety of reasons, and there are various bells and whistles versions of the CRC computation that avoid the possibility that a transmission consists entirely of zeros. One of these bells and whistles versions prepends a nonzero header to the data to be transmitted (the header is discarded at the receiver). Thus, if we have $M$ bits of data (and so $d(x)$ is of degree $M-1$) and the header $h(x)$ is $m$ bits in length, then what gets divided by $C(x)$ is not $x^nd(x)$ but instead $x^{m+M+n}h(x) + x^nd(x)$ which stream of bits is the header $h(x)$ followed by the data string $d(x)$ followed $n$ zeroes. What gets sent out over the channel (or recorded in memory or disk or flash drive) is $x^{m+M+n}h(x) + x^nd(x) + hat{r}(x)$ where $hat{r}(x)$ is the remainder when $x^{m+M+n}h(x) + x^nd(x)$ is divided by $C(x)$; it is different from the remainder when $x^nd(x)$ is divided by $C(x)$. In particular, even if $d(x)$ is a stream of zeroes, $hat{r}(x)$ is nonzero (unless the system designer not thought through the problem and has chosen $h(x)$ to be $C(x)$ itself (or a polynomial multiple of $C(x)$ which should be a fireable offense!) The CRC checksum being all zeroes is not an issue now even if $d(x)$ is all zeroes: the header and CRC checksum are nonzero. Another alternative is to simply complement the first two data bytes (used if $C(x)$ has degree 16) or four data data bytes (if $C(x)$ has degree 32) before passing them to the division circuit that computes the remainder from the division of $x^nd(x)$. The receiver must, if curse, remember to undo the complementation suffered by the leading data bytes at the transmitter. This method does not increase the transmission length but has the obvious disadvantage that if the data happens to be the size of the US national debt (a number in the trillions with a large number of trailing zeros), complementation of the leading bytes at the transmitter might modify the transmitted data stream to be all zeroes!
$endgroup$
The OP's "equations"are not quite right. If the data that is to be transmitted is represented by $d(x)$ and the CRC polynomial is $C(x)$ of degree $n$, then the no bells and whistles CRC algorithm divides $x^nd(x)$ by $C(x)$ to produce a quotient polynomial $q(x)$ and a remainder polynomial $r(x)$ of degree smaller than $n$, the degree of $C(x)$. The CRC checksum is $r(x)$. The equation describing the relationship is
$$x^nd(x) = q(x)C(x) + r(x)tag{1}$$
and not what the OP has written. Now from $(1)$, we get that
$$q(x)C(x) = x^nd(x) - r(x) = x^nd(x) + r(x)tag{2}$$
where the second equality is using the fact that in the binary field, addition and subtraction are the same operation. Thus, $x^nd(x) + r(x)$ is a multiple of the CRC polynomial $C(x)$. What is transmitted is $x^nd(x) + r(x)$. But notice that the coefficients of $x^0, x, x^2, ldots, x^{n-1}$ in $x^nd(x)$ all are $0$ while $r(x)$ is of degree $n-1$ or less, and so we see that what is actually transmitted is the data bits (the $x^nd(x)$ part) followed by the CRC checksum $r(x)$: the trailing $n$ zeroes in $x^nd(x)$ have been neatly filled in by the CRC checksum.
Now, if $d(x)$, the data to be transmitted, is a long string of zeroes, then $(1)$ and $(2)$ show that the CRC checksum is a string is $n$ zeroes, and so the entire transmission is a long string of zeroes. This is deemed to be unsuitable for a variety of reasons, and there are various bells and whistles versions of the CRC computation that avoid the possibility that a transmission consists entirely of zeros. One of these bells and whistles versions prepends a nonzero header to the data to be transmitted (the header is discarded at the receiver). Thus, if we have $M$ bits of data (and so $d(x)$ is of degree $M-1$) and the header $h(x)$ is $m$ bits in length, then what gets divided by $C(x)$ is not $x^nd(x)$ but instead $x^{m+M+n}h(x) + x^nd(x)$ which stream of bits is the header $h(x)$ followed by the data string $d(x)$ followed $n$ zeroes. What gets sent out over the channel (or recorded in memory or disk or flash drive) is $x^{m+M+n}h(x) + x^nd(x) + hat{r}(x)$ where $hat{r}(x)$ is the remainder when $x^{m+M+n}h(x) + x^nd(x)$ is divided by $C(x)$; it is different from the remainder when $x^nd(x)$ is divided by $C(x)$. In particular, even if $d(x)$ is a stream of zeroes, $hat{r}(x)$ is nonzero (unless the system designer not thought through the problem and has chosen $h(x)$ to be $C(x)$ itself (or a polynomial multiple of $C(x)$ which should be a fireable offense!) The CRC checksum being all zeroes is not an issue now even if $d(x)$ is all zeroes: the header and CRC checksum are nonzero. Another alternative is to simply complement the first two data bytes (used if $C(x)$ has degree 16) or four data data bytes (if $C(x)$ has degree 32) before passing them to the division circuit that computes the remainder from the division of $x^nd(x)$. The receiver must, if curse, remember to undo the complementation suffered by the leading data bytes at the transmitter. This method does not increase the transmission length but has the obvious disadvantage that if the data happens to be the size of the US national debt (a number in the trillions with a large number of trailing zeros), complementation of the leading bytes at the transmitter might modify the transmitted data stream to be all zeroes!
edited Jan 19 at 18:34
answered Jan 19 at 4:29
Dilip SarwateDilip Sarwate
19.5k13078
19.5k13078
$begingroup$
Thanks for taking the time to answer, Dilip! But my question is how is the seed value folded into the equations? The seed isn't normally transmitted as part of the message - it's agreed between the rx and tx up-front. I just don't know how it works in the maths...
$endgroup$
– Marty
Jan 19 at 17:17
add a comment |
$begingroup$
Thanks for taking the time to answer, Dilip! But my question is how is the seed value folded into the equations? The seed isn't normally transmitted as part of the message - it's agreed between the rx and tx up-front. I just don't know how it works in the maths...
$endgroup$
– Marty
Jan 19 at 17:17
$begingroup$
Thanks for taking the time to answer, Dilip! But my question is how is the seed value folded into the equations? The seed isn't normally transmitted as part of the message - it's agreed between the rx and tx up-front. I just don't know how it works in the maths...
$endgroup$
– Marty
Jan 19 at 17:17
$begingroup$
Thanks for taking the time to answer, Dilip! But my question is how is the seed value folded into the equations? The seed isn't normally transmitted as part of the message - it's agreed between the rx and tx up-front. I just don't know how it works in the maths...
$endgroup$
– Marty
Jan 19 at 17:17
add a comment |
Thanks for contributing an answer to Mathematics Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
Use MathJax to format equations. MathJax reference.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fmath.stackexchange.com%2fquestions%2f3077723%2fwhat-is-the-theory-behind-seeding-a-crc%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown