Finding prime numbers without using "prime characters" Your task, if you choose to accept it, is to write a program/function that accepts an integer \$N\$ as input. The program/function should output/return a list of the first \$N\$ prime numbers. But here's the catch: you are not allowed to use prime characters in your code. A prime character is a character whose Unicode code point is a prime number. In the printable ASCII range, these are:
%)+/5;=CGIOSYaegkmq

But the rule also applies to non-ASCII characters if your code uses those.

A valid input is an integer \$N\$ where \$0 &lt; N \le T\$, where you can choose \$T\$, but it has to be greater than or equal to \$10000\$. \$T\$ does not have to be finite.
For invalid inputs (non-integers, integers out of range), throw an exception or output/return nothing/null.
An integer with leading/trailing whitespace as input is considered invalid.
An integer with a + as sign character as input is considered invalid.
An integer with leading zeros as input is considered valid.
If your language allows you to pass an already-parsed integer as input, the above parsing rules (except the range one) don't apply, because the int is already parsed.
The input is always base-10.
Use of built-in prime generators and primality testers (this includes prime factorization functions) is not allowed.
The source restriction is imposed on Unicode characters, but the byte counting for the score can be in another encoding if you wish.
The output can contain a single trailing newline, but this is not required.
If you output/return the prime number list as a string, then every prime number must be delimited by one or multiple non-digit char(s). You can choose which delimiter you use.
This is a code-golf challenge, the shortest code in bytes wins.

Stack Snippet to verify your code
You can use the below Stack Snippet to verify that your code does not contain prime chars:


var primes=[],max=10000;for(var i=2;i&lt;=max;i++){primes.push(i);}for(var N=2;N&lt;Math.sqrt(max);N++){if(primes.indexOf(N)===-1){continue;}primes=primes.filter(function (x){return x===N||x%N!==0;});}function setText(elem,text){var z=('innerText' in elem)? 'innerText' : 'textContent';elem[z]=text;}function verify(inputCode,resultSpan){var invalidChars=[];var success=true;for(var i=0;i&lt;inputCode.length;i++){var cc = inputCode.charCodeAt(i);if (cc&gt;max){setText(resultSpan,"Uh oh! The char code was bigger than the max. prime number calculated by the snippet.");success = false;break;}if (primes.indexOf(cc)!==-1){invalidChars.push(inputCode[i]);}}if (invalidChars.length===0&amp;&amp;success){setText(resultSpan, "Valid code!");}else if(success) {  var uniqueInvalidChars = invalidChars.filter(function (x, i, self){return self.indexOf(x)===i;});setText(resultSpan, "Invalid code! Invalid chars: " + uniqueInvalidChars.join(""));    }}document.getElementById("verifyBtn").onclick=function(e){e=e||window.event;e.preventDefault();var code=document.getElementById("codeTxt").value;verify(code,document.getElementById("result"));};
Enter your code snippet here:&lt;br /&gt;&lt;textarea id="codeTxt" rows="5" cols="70"&gt;&lt;/textarea&gt;&lt;br /&gt;&lt;button id="verifyBtn"&gt;Verify&lt;/button&gt;&lt;br /&gt;&lt;span id="result"&gt;&lt;/span&gt;
CJam, 19 18 30 34 33 19 17 21 20 bytes

Try it online.

{_3\#,2&gt;__ff*:~-&lt;N*}


This is probably one of the most horribly inefficient algorithms I've ever implemented. But I did it for the size!

My answer consists of a code block, which acts like an anonymous function in CJam. Run it with an integer immediately preceding it on the stack, and the resulting list is dumped onto the stack. I treat the upper bound on the input as infinite so I don't have to check that bound.

My algorithm starts by raising 3 to the inputth power, which is guaranteed to give a number larger than the input-th prime if the input is valid. Then a list of the integers from 2 to this number minus one is generated, which is a large enough swath to contain all the prime numbers we want. To get rid of the composite numbers... sigh... we create a list of every pairwise product, which should generate all composite numbers from 4 to some stupidly large value, large enough for our purposes. Then it's just a matter of removing every element from the original list that is in this composite list, trimming it down to the first input elements, and joining the elements with the newline character.

The algorithm should work for any input. However, whether or not the interpreter/computer has enough memory or time is a whole other question, because the time and space requirements are exponential with respect to the input. So if the input is larger than about 5 for the online interpreter or about 8 for the offline one, then the answer to that question is probably no.